因为在Jython 调用 Java 碰壁全纪录中已经有了“出色”碰壁经历,此处仿照其大致过程

命令行下无差异,Eclipse中略有差异(classpath的设置方式不同所致)

JavaClass 的定义
public class JavaClass {
    private String str = "";
    public JavaClass() {
        this.str = "JavaClass Init";
    }
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
}

一、命令行模式

1、进入 python 目录,查看当前目录下只有一个JavaClass.java文件

D:\>cd python
D:\python>dir
2012-03-13  09:59    <DIR>          .
2012-03-13  09:59    <DIR>          ..
2012-03-13  09:59               227 JavaClass.java
               1 个文件            227 字节
               2 个目录 37,943,169,024 可用字节
              
2、启动Python命令行模式(Python版本是 2.7)

D:\python>python

3、导入 JavaClass时,提示找不到JavaClass模块

>>> from jpype import *
>>> jvmPath = getDefaultJVMPath()
>>> startJVM(jvmpath)
>>> startJVM(jvmPath)
>>> JavaClass = JClass("JavaClass")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
    raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class JavaClass not found

原因:Python中导入的是.class文件,而JavaClass.java尚未编译生成 .class文件

4、Ctrl-Z退出 Python, 编译 JavaClass.java

D:\python>javac JavaClass.java
D:\python>dir
2012-03-13  10:12    <DIR>          .
2012-03-13  10:12    <DIR>          ..
2012-03-13  10:12               443 JavaClass.class
2012-03-13  09:59               227 JavaClass.java
               2 个文件            670 字节
               2 个目录 37,943,169,024 可用字节

5、按第2步,再次进入Python模式后导入 JavaClass时未报异常,说明成功导入,简单调用情况如下

D:\python>python

>>> from jpype import *
>>> jvmPath = getDefaultJVMPath()
>>> startJVM(jvmpath)
>>> startJVM(jvmPath)
>>> JavaClass = JClass("JavaClass")
>>> jc = JavaClass()
>>> jc.str   // 调用get方法
'JavaClass Init'
>>> jc.str = "JavaClass Set"   // 调用set方法
>>> jc.str
'JavaClass Set'

二、eclipse IDE 环境

workplace 是d:\python,项目名称是mython,其结构如下

mython
    ......
    bin
        javaDemo
            JavaClass.class
        pythonDemo
            Py2Ja.py
    src
        javaDemo
            JavaClass.java
        pythonDemo
            Py2Ja.py

1、JavaClass.java同上(但是第一行多了一个package javaDemo的定义)

2、编辑Py2Ja.py如下:

from jpype import *
jvmPath = getDefaultJVMPath()
startJVM(jvmPath)
JavaClass = JClass("javaDemo.JavaClass")
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str
shutdownJVM()

测试运行时报异常
Traceback (most recent call last):
  File "D:\python\mython\src\pythonDemo\Py2Ja.py", line 4, in <module>
    JavaClass = JClass("javaDemo.JavaClass")
  File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
    raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class javaDemo.JavaClass not found

原因:找不到javaDemo是因为“当前路径”下找不到JavaDemo文件或者目录

解决方法:手工添加JVM的启动参数-Djava.class.path ='D:\python\Mython\src

3再次修改后如下:

from jpype import *
jvmPath = getDefaultJVMPath()
classPath = "f:\workplace\Python\src"
jvmArg = "-Djava.class.path="+classPath
startJVM(jvmPath, jvmArg)
JavaClass = JClass("javaDemo.JavaClass")
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str
shutdownJVM()

测试运行时仍然报异常
Traceback (most recent call last):
  File "F:\workplace\Python\src\pythonDemo\Py2Ja.py", line 6, in <module>
    JavaClass = JClass("javaDemo.JavaClass")
  File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
    raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class javaDemo.JavaClass not found

与2中的异常一样:找不到JavaClass。

原因:我们已经设置了-Djava.class.path ='D:\python\Mython\src,仍然找不到JavaClass,只能说明是找不到JavaClass.class文件

在命令行中第3步中提到Python文件导入的应该是.class文件,在看前面mython项目的整个目录发现,class文件在mython\bin\javaDemo中。也就是说可能是因为编译器找到了JavaClass的定义即 JavaClass.java,但是找不到它的.class文件。

那java文件对应的class文件为什么不是在src包下的JavaDemo中,而是在bin包下的JavaDemo中?

右击项目mython->Properties->Java Build Path->source最下面有default output folder中默认的是mython\bin,且这个目录在 Package Explorer视图下是看不到的,在Navigator视图中可以看到。

4、将default output folder 修改为 mython\src,目录结构变化如下

mython
    ......

src
        javaDemo
            JavaClass.class
            JavaClass.java
        pythonDemo
            Py2Ja.py

测试运行成功:
JavaClass Init
JavaClass IDE

JVM activity report     :
 classes loaded       : 20
JVM has been shutdown

总结:对于新手不太习惯命令行式的Java程序调试,IDE虽然简单方便,但是都有自己默认的规则。这些规则新手可能注意不到,所以在IDE环境中照搬程序源码的时候,总会报一些奇奇怪怪的错误,使得本来简单的问题看上去很复杂。究其原因:1、对开发环境不熟悉、2、java基础不扎实。

特殊情况备注:

1、***.py文件运行时,默认路径即该文件的所在路径,导入***.class时的路径就变成了 ***.py所在的包 + from中的包,即默认.class文件是在 ***.py所在的包 的 子包中,所以在调用Java文件时,需要特别添加class文件所在路径。即使Java文件和Python文件在同一个包中,Java文件仍然在某个包中,测试运行时仍然要设置java文件所在的包最上级所在的目录,一般为 src。

2、将Java文件和Python文件都放在 src 下时,虽然目录结构中显示一个叫"(default package)",但是在Java文件的内部是没有包的设定的,这种情况下运行Python文件时,可不手工设置class文件所在路径,因为此时 Python文件的所在目录为src,而Java文件也在src中,且没有包名引起的问题。

刚刚接触 Python,因为基础不太扎实,期间诸多碰壁,仅此记录。

成长的道路上不怕跌倒,怕的是的跌倒了再也爬不起来。为自己加油!

Python+Jpype 调用 Java 碰壁全记录相关推荐

  1. Jython 调用 Java 碰壁全纪录

    JavaClass 的定义 public class JavaClass {     private String str = "";     public JavaClass() ...

  2. python jpype 调用java之坑

    1.初始运行环境python 2.7 32位,jdk 1.8 32位,pycharm 32位 python使用jpype获取jvm位置信息,无法获取.之后使用jvm的绝对路径调用jvm,发现调用jvm ...

  3. Python利用JPype调用Java对象方法【实现在Python中调用JAVA】

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  4. python利用jpype调用java对象方法

    实现在python中调用JAVA 一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器 ...

  5. NWJS 调用java问题处理记录

    NWJS 调用java问题处理记录 有关NWJS调用JAVA安装与发布运行时的问题: 1:确认nwjs使用的版本(x86或x86-64)与本机使用的node版本一致. 2:提示Error: Canno ...

  6. JPype:实现在python中调用JAVA 和 错误处理

    JPype使用说明 1.安装jpype 安装的时候输入:  pip install jpype1  (后面要加一个1) 2.启动JVM JPype 提供的 startJVM() 函数的作用是启动 JA ...

  7. 如何用pycharm调用Java_JPype实现在python中调用JAVA的实例

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  8. jaydebeapi可以连接_Python安装jpype调用java,安装jaydebeapi通过jdbc连接数据库

    1 importjpype,os,time,timer2 from jpype importjava3 from jpype importjavax4 5 HOST='192.168.48.103' ...

  9. python编写爬虫的步骤-零基础写python爬虫之爬虫编写全记录

    先来说一下我们学校的网站: http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html 查询成绩需要登录,然后显示各学科成绩,但是只显示成绩而没有绩点,也就是 ...

最新文章

  1. 搞定vim的窗口操作
  2. Linux dmidecode备忘
  3. gbdt和xgboost中feature importance的获取
  4. linux中的进程、环境变量和虚拟地址
  5. 点赞!刘强东:无论京东员工遭遇何种不幸,将负责其子女费用到22岁
  6. 2012第51周星期二
  7. linux服务器邮局,linux系统下安装postfix邮局服务器
  8. visio业务流程图教学_visio业务流程图怎么画
  9. 跟父母还是要保持一定的距离感
  10. 如何删除部分页的页眉页脚
  11. 如何将计算机硬盘导出,移动硬盘坏了怎么导出数据?这几点一定要牢记!
  12. 政治正确的睡前故事(4则)【搬运】【破事水】
  13. 使用PHP获取网站Favicon的方法
  14. Linux开放80端口
  15. 联通的光纤--无线路由--mac过滤--存在问题
  16. 史上最全Maven教程(五)
  17. 拯救者R9000P AMD处理器 ubunu18.04 外接显示器失败 无法调节亮度 显卡无法驱动 好用
  18. 动态规划算法问题分析_背包问题_求相隔数据之间最大和_算法理解
  19. android ios打包工具下载,IOS移动开发之快速打包工具---- iTunes 降级 到12.6,回到你熟悉的版本...
  20. Centos镜像地址列表(全)

热门文章

  1. matlab怎么画probit,matlab对于probit模型怎么求统计值(赠probit程序)
  2. 免堆期由谁申请_免箱期和免堆期的区别_如何避免滞箱
  3. 真实3D地形生成器【免费在线】
  4. Nacos(一):Nacos介绍
  5. 年轻的朋友们,我们来相会!
  6. 如何避免快递业务中的货物运输损坏
  7. 栈的重要应用---四则运算
  8. 重庆IT互联网企业有哪些?
  9. c语言程序设计西南交通大学出版社答案,C语言程序设计习题指导
  10. Total Recorder Professional V6.0 注册版