导入jar fi时pyjnius“未找到类”

2024-05-19 22:46:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使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

但这给了我同样的结果。 我在做一个虚拟的btw。 我已经尝试了所有我能在网上找到的方法,但它根本不起作用。我不得不手动安装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 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$ 

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


Tags: inorgimportpostgresqlsamlinejavamyapp
3条回答

我在Eclipse中将JAR导出为一个可运行的JAR文件,从而解决了这个问题:

  1. 如果没有主方法,请在某处创建一个空的主方法(否则导出对我不起作用)
  2. 转到文件->;导出。。。
  3. 选择Java->;可运行JAR文件
  4. 单击“下一步”
  5. 在启动配置中选择主方法
  6. 选择出口目的地
  7. 选择“将所需的库复制到生成的JAR旁边的子文件夹中”作为库处理(在我的特殊情况下,这是唯一对我有效的选项,但您也可以测试其他选项)
  8. 单击“完成”

当我使用jar文件时,它工作得很好。 您是否尝试使用完整路径来定义类路径?

  • Windows 7
  • Python2.7.8
  • jnius 1.1-开发

本页将作为参考。 http://www.hackzine.org/using-apache-tika-from-python-with-jnius.html

我只是想留下一个评论,但我没有足够的声誉。 所以我留下一个答案作为评论。

在调用autocrass时,最好不要使用“/”而不是“.”。 请参阅下面的链接。

http://pyjnius.readthedocs.org/en/latest/api.html#jnius.autoclass

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

较长版本:

我有一个非常相似的问题,有一个很大的不同:一些文件工作没有任何问题,其他(在同一个目录)没有

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

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

相关问题 更多 >