java - 导入jar文件时pyjnius "Class not found"

标签 java python pyjnius py4j

我试图让 pyjnius 使用我从 java 应用程序构建的 jar 文件,但我不断收到“找不到类”错误:

>>> import os
>>> os.environ['CLASSPATH'] = "~/workspace/myapp-Tools/Admin/Console/couchdb/myapp-web.jar"
>>> from jnius import autoclass
>>> bla = autoclass('com/myapp/webapp/server/helpers/licensee/CalculationHelper')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/sam/workspace/myapp-Tools/Admin/Console/couchdb/virtualenv/local/lib/python2.7/site-packages/jnius/reflect.py", line 150, in autoclass
   c = find_javaclass(clsname)
 File "jnius_export_func.pxi", line 23, in jnius.find_javaclass (jnius/jnius.c:12815)
jnius.JavaException: Class not found 'com/myapp/webapp/server/helpers/licensee/CalculationHelper'
>>> 

当然我已经检查过了:

jar tf myapp-web.jar

com/myapp/webapp/server/helpers/licensee/CalculationHelper.class 就在那里

我也试过这样设置类路径:

import jnius_config
jnius_config.set_classpath('.', '~/workspace/myapp-Tools/Admin/Console/couchdb/')
#import jnius
from jnius import autoclass

但这给了我同样的结果。 我正在研究 virtualenv 顺便说一句。 我已经尝试了所有可以在网上找到的方法,但根本行不通。我不得不手动安装 pyjnius,因为使用 pip 得到了它的旧版本。 任何帮助都将非常感激。


编辑:用不是我创建的 jar 尝试了这个,我看到了不同的错误

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import jnius_config
>>> jnius_config.add_classpath('/home/sam/workspace/someproject/*')
>>> jnius_config.expand_classpath()
'/home/sam/workspace/someproject/annotations.jar:/home/sam/workspace/someproject/junit-4.10.jar:/home/sam/workspace/someproject/    postgresql-8.1-408.jdbc3.jar'
>>> import jnius
>>> from jnius import autoclass
>>> test = autoclass('org/postgresql/geometric/PGcircle.class')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sam/workspace/myapp-Tools/Admin/Console/couchdb/virtualenv/local/lib/python2.7/site-packages/jnius/reflect.py", line 150,     in autoclass
    c = find_javaclass(clsname)
  File "jnius_export_func.pxi", line 23, in jnius.find_javaclass (jnius/jnius.c:12815)
jnius.JavaException: Class not found 'org/postgresql/geometric/PGcircle/class'
>>> test = autoclass('org/postgresql/geometric/PGcircle')
Exception in thread "main" java.lang.NoClassDefFoundError: org/postgresql/geometric/PGcircle/class
Caused by: java.lang.ClassNotFoundException: org.postgresql.geometric.PGcircle.class
  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sam/workspace/myapp-Tools/Admin/Console/couchdb/virtualenv/local/lib/python2.7/site-packages/jnius/reflect.py", line 156,     in autoclass
    for constructor in c.getConstructors():
  File "jnius_export_class.pxi", line 562, in jnius.JavaMethod.__call__ (jnius/jnius.c:19385)
  File "jnius_export_class.pxi", line 649, in jnius.JavaMethod.call_method (jnius/jnius.c:20409)
  File "jnius_utils.pxi", line 43, in jnius.check_exception (jnius/jnius.c:3533)
jnius.JavaException: JVM exception occured
>>> test = autoclass('org/postgresql/geometric/PGcircl')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sam/workspace/myapp-Tools/Admin/Console/couchdb/virtualenv/local/lib/python2.7/site-packages/jnius/reflect.py", line 150,     in autoclass
    c = find_javaclass(clsname)
  File "jnius_export_func.pxi", line 23, in jnius.find_javaclass (jnius/jnius.c:12815)
jnius.JavaException: Class not found 'org/postgresql/geometric/PGcircl'
>>> 

下面是那个 jar 上的 jar tf 的内容:

sam@lambda ~/workspace$ jar tf ./someproject/postgresql-8.1-408.jdbc3.jar
META-INF/
META-INF/MANIFEST.MF
...
org/postgresql/geometric/PGbox.class
org/postgresql/geometric/PGcircle.class
org/postgresql/geometric/PGline.class
org/postgresql/geometric/PGlseg.class
org/postgresql/geometric/PGpath.class
org/postgresql/geometric/PGpoint.class
org/postgresql/geometric/PGpolygon.class
...
sam@lambda ~/workspace$ 

再一次...任何帮助将不胜感激!

最佳答案

tl;dr: 确保将 .java 文件编译为(至多)与系统上的 Java 版本相同的 Java 版本 .class 文件使用 pyjnius 导入文件。

更长的版本:

我遇到了一个非常相似的问题,但有一个很大的不同:有些文件可以正常工作,而其他文件(在同一目录中)则没有。

导致“未找到类”异常的文件问题是我在具有 Java 8 的 Windows 下编译它们。然而,Ubuntu 当前在运行“sudo apt-get install default-jdk”时安装 Java 7 .

因此,pyjnius 无法在我的 Java 7 Ubuntu 安装中导入 Java 8 文件。奇怪的是它抛出了“未找到类”异常,而不是更具描述性的异常。将目标输出更改为 1.7 解决了我的问题。

关于java - 导入jar文件时pyjnius "Class not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973396/

相关文章:

python - 保存模型以供以后预测(OneVsRest)

Python 响应解码

python - Kivy 和 android 共享首选项

python-3.x - 在 python 中使用 imagej 时导入模块 jnius 出错

java - 皮尼乌斯。导入错误: DLL load failed: The specified module was not found

Java 流 : How to avoid add null value in Collectors. toList()?

java - 微服务与Python的异步通信

python - 如何使用 `imageio` 在视频中寻找帧?

java - Spring Boot 和 Elasticsearch 连接问题

java - JavaFX 中正方形的网格 Pane