6

Java アプリケーションからビルドした jar ファイルでpyjniusを動作させようとしていますが、「クラスが見つかりません」というエラーが表示され続けます。

>>> 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で作業しています。オンラインで見つけることができるすべてのアプローチを試しましたが、うまくいきません。pipを使用すると古いバージョンのpyjniusが得られたため、pyjniusを手動でインストールする必要がありました。どんな助けでも歓迎です。


編集:私が作成したものではない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$ 

繰り返しますが...どんな助けでも大歓迎です!

4

7 に答える 7

5

tl;dr: .java ファイルが、pyjnius を使用してファイルをインポートするシステム上の Java バージョンと (最大で) 同じ Java バージョンの .class ファイルにコンパイルされていることを確認してください。

より長いバージョン:

私は非常によく似た問題を抱えていましたが、大きな違いが 1 つあります。一部のファイルは問題なく機能し、他のファイル (同じディレクトリ内) は機能しませんでした。

「クラスが見つかりません」という例外の原因となったファイルの問題は、Java 8 を搭載した Windows でファイルをコンパイルしたことです。しかし、Ubuntu は現在、「sudo apt-get install default-jdk」を実行すると Java 7 をインストールします。

そのため、pyjnius は Java 7 Ubuntu インストールに Java 8 ファイルをインポートできませんでした。より説明的なものではなく、「クラスが見つかりません」という例外をスローするのは奇妙です。ターゲット出力を 1.7 に変更すると、問題が解決しました。

于 2015-10-21T12:32:27.263 に答える
2

JARをEclipseで実行可能なJARファイルとしてエクスポートすることで、この問題を解決しました。

  1. 空のメイン メソッドがない場合は、どこかに作成します (それ以外の場合、エクスポートは機能しませんでした)。
  2. [ファイル] -> [エクスポート...] に移動します。
  3. Java->実行可能なJARファイルを選択します
  4. [次へ] をクリックします
  5. 起動構成でメインメソッドを選択します
  6. エクスポート先を選択
  7. ライブラリ処理として「必要なライブラリを生成されたJARの隣のサブフォルダーにコピーする」を選択します(私の特別なケースで機能した唯一のオプションですが、他のオプションをテストすることもできます)
  8. [完了] をクリックします
于 2015-09-14T12:50:37.617 に答える
1

私のjarファイルを使用するとうまくいきます。フルパスを使用して CLASSPATH を定義しようとしましたか?

  • ウィンドウズ7
  • パイソン 2.7.8
  • jnius 1.1-dev

このページが参考になります。 http://www.hackzine.org/using-apache-tika-from-python-with-jnius.html

コメントを残したかっただけですが、十分な評判がありません。だから私はコメントとして答えを残します。

また、「.」の代わりに「/」を使用しない方がよいでしょう。autoclass を呼び出すとき。以下のリンクを参照してください。

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

于 2015-01-27T03:39:02.543 に答える
0

export を介して CLASSPATH を追加してから、python スクリプトを実行しようとしましたか? これは私にとってはうまくいきました。

$ export CLASSPATH="~/workspace/myapp-Tools/Admin/Console/couchdb/myapp-web.jar"
于 2015-02-03T10:14:32.640 に答える