我试图让 pyjnius 使用我从java应用程序构建的jar文件,但是我一直得到" Class not found"错误:
>>> 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
但这给了我同样的结果。 我正在努力工作。 我已经尝试过我可以在网上找到的所有方法,但它根本不起作用。我不得不手动安装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$
再次......非常感谢任何帮助!
答案 0 :(得分:1)
当我使用我的jar文件时它工作正常。 您是否尝试使用完整路径来定义CLASSPATH?
此页面将作为参考。 http://www.hackzine.org/using-apache-tika-from-python-with-jnius.html
我只是想留言,但我没有足够的声誉。 所以我留下答案作为评论。
你最好不要用“/”代替“。”当你调用autoclass。 请参阅以下链接。
http://pyjnius.readthedocs.org/en/latest/api.html#jnius.autoclass
答案 1 :(得分:1)
我通过在Eclipse中将JAR导出为可运行的JAR文件解决了这个问题:
答案 2 :(得分:1)
tl; dr:确保将 .java文件编译为(最多)与系统上的Java版本相同的Java版本 .class文件用pyjnius导入文件。
更长的版本:
我有一个非常类似的问题,有一个很大的区别:一些文件没有任何问题,另一些文件(在同一目录中)没有。
导致“未找到”类的文件出现问题&#39;例外情况是我在具有Java 8的Windows下编译它们。但是当你运行&#34; sudo apt-get install default-jdk&#34;时,Ubuntu会安装Java 7.
因此,pyjnius无法在我的Java 7 Ubuntu安装上导入Java 8文件。奇怪的是,它引发了一个未被发现的班级&#39;例外,而不是更具描述性的东西。将目标输出更改为1.7解决了我的问题。
答案 3 :(得分:0)
您是否尝试通过导出添加CLASSPATH然后运行您的python脚本?这对我有用。
$ export CLASSPATH="~/workspace/myapp-Tools/Admin/Console/couchdb/myapp-web.jar"
答案 4 :(得分:0)
旧帖子,但在对某人有用的情况下发布答案。
我在那里看到两个问题,不确定是否您已经尝试过这些问题:
更改
jnius_config.set_classpath('。','〜/ workspace / myapp-Tools / Admin / Console / couchdb /')
收件人
jnius_config.set_classpath('。','〜/ workspace / myapp-Tools / Admin / Console / couchdb / *')
和
test = autoclass('org / postgresql / geometric / PGcircl')
收件人
test = autoclass('org.postgresql.geometric.PGcircl')
答案 5 :(得分:0)
我通过将 CLASSPATH 放在 .bashrc
中解决了这个问题CLASSPATH="~/documents/download/programs/tika-app.jar"
它正常工作
答案 6 :(得分:0)
下面的代码将jar添加到类路径,然后显示类路径以进行进一步调试。
import os
import jnius_config
jnius_config.add_classpath("PATH_HERE/SOME.jar")
from jnius import autoclass, cast
ClassLoader = autoclass('java.lang.ClassLoader')
cl = ClassLoader.getSystemClassLoader()
ucl = cast('java.net.URLClassLoader', cl)
urls = ucl.getURLs()
tmp = [url.getFile() for url in urls]
print('\n'.join(tmp))