pyjnius "Класс не найден" при импорте файла JAR

Я пытаюсь заставить Pyjnius работать с файлом JAR, который я создал из Java-приложения, но получаю сообщение об ошибке "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

Но это дало мне тот же результат. Я работаю над Virtualenv, кстати. Я перепробовал все подходы, которые мог найти в Интернете, но он просто не работает. Мне пришлось вручную установить pyjnius, потому что использование pip дало мне его старую версию. Любая помощь будет принята с благодарностью.


Редактировать: попробовал это с банкой, не созданной мной, и я вижу другую ошибку

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 на этом jar:

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$ 

Опять же... любая помощь будет принята с благодарностью!

5 ответов

tl;dr: убедитесь, что файлы.java скомпилированы (в лучшем случае ) в те же файлы.class версии Java, что и версия Java в системе, которая будет импортировать файл с pyjnius.

Более длинная версия:

У меня была очень похожая проблема, с одной большой разницей: некоторые файлы работали без проблем, а другие (в том же каталоге) не работали.

Проблема с файлами, которая вызвала исключение "Класс не найден", заключалась в том, что я скомпилировал их под Windows, в которой установлена ​​Java 8. Однако в настоящее время Ubuntu устанавливает Java 7 при запуске "sudo apt-get install default-jdk".

И вот, pyjnius не смог импортировать файлы Java 8 на моей установке Java 7 Ubuntu. Странно, что он выдает исключение "Класс не найден" вместо чего-то более описательного. Изменение целевого выхода до 1,7 решило мою проблему.

Я решил эту проблему, экспортировав JAR как исполняемый файл JAR в Eclipse:

  1. создайте пустой метод main где-нибудь, если у вас его нет (иначе экспорт не работал для меня)
  2. перейдите в Файл-> Экспорт...
  3. выберите Java->Runnable JAR-файл
  4. Нажмите кнопку "Далее
  5. выберите основной метод в конфигурации запуска
  6. выберите пункт назначения экспорта
  7. выберите "Копировать необходимые библиотеки в подпапку рядом с сгенерированным JAR" в качестве Обработки библиотек (единственный вариант, который работал для меня в моем особом случае, но вы также можете протестировать другие)
  8. нажмите Готово

Старый пост, но выкладываю ответ, если он кому-то полезен.

Я вижу там две проблемы, не уверен, что вы попробовали их вместе:

+ Изменить

jnius_config.set_classpath('.', '~/workspace/myapp-Tools/Admin/Console/couchdb/')

к

jnius_config.set_classpath('.', '~/workspace/myapp-Tools/Admin/Console/couchdb/*')

А также

test = автокласс ('org/postgresql/ геометрический /PGcircl')

к

test = autoclass('org.postgresql.geometric.PGcircl')

Он отлично работает, когда я использую файл JAR. Вы пытались использовать полный путь для определения CLASSPATH?

  • Windows 7
  • Python 2.7.8
  • JNIUS 1,1-Dev

Эта страница будет полезна в качестве ссылки. http://www.hackzine.org/using-apache-tika-from-python-with-jnius.html

Я просто хотел оставить комментарий, но у меня недостаточно репутации для этого. Поэтому я оставляю ответ как комментарий.

И вам лучше не использовать "/" вместо "." когда вы вызываете автокласс. Смотрите ссылку ниже.

http://pyjnius.readthedocs.org/en/latest/api.html

Я решил эту проблему, поместив CLASSPATH в .bashrc

CLASSPATH = "~ / документы / загрузки / программа / ТИК-app.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))

Вы пытались добавить CLASSPATH через экспорт, а затем запустить свой скрипт Python? Это сработало для меня.

$ export CLASSPATH="~/workspace/myapp-Tools/Admin/Console/couchdb/myapp-web.jar"
Другие вопросы по тегам