3

$ unzip -l output.jarコンテンツ ( )を含む jar ファイルがあります。

Archive:  output.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2013-07-08 17:57   META-INF/
      120  2013-07-08 17:57   META-INF/MANIFEST.MF
        0  2013-07-08 17:43   some/
        0  2013-07-08 17:43   some/package/
     1247  2013-07-08 17:57   some/package/Main.class
     2032  2013-07-08 17:57   some/package/plsql_o12_lexer$DFA22.class
     8022  2013-07-08 17:57   some/package/plsql_o12_lexer$DFA23.class
   212573  2013-07-08 17:57   some/package/plsql_o12_lexer.class
---------                     -------
   223994                     11 files

の内容META-INF/MANIFEST.MFは次のとおりです。

Manifest-Version: 1.0
Created-By: 1.6.0_27 (Sun Microsystems Inc.)
Main-Class: some.package.Main

ただし、コマンドを実行し$ echo $CLASSPATH; java -jar output.jarます。CLASSPATH 変数が設定されていることに注意してください。

/usr/share/java/antlr3-runtime-3.2.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/runtime/CharStream
Caused by: java.lang.ClassNotFoundException: org.antlr.runtime.CharStream
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: some.package.Main. Program will exit.

コマンドを実行する$ java -classpath /usr/share/java/antlr3-runtime-3.2.jar -jar output.jarと、まったく同じ結果が得られます。私もクラスパスとして試してみ.:/usr/share/java/antlr3-runtime-3.2.jarましたが.:./output.jar:/usr/share/java/antlr3-runtime-3.2.jar、同じ結果です。ファイルantlr3-runtime-3.2.jarにはクラスが含まれてorg.antlr.runtime.CharStreamいます。確認しました。

ただし、実行java -verbose -jar output.jarすると、次の行を含む結果が得られます。

[Loaded some.package.Main from file:/home/jan/projects/antlr-plsql/output.jar]

私のJavaは:

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.5) (6b27-1.12.5-0ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

Java が想定どおりに動作しないのはなぜですか?

4

3 に答える 3

5

docに従って -jar スイッチが使用されている場合、他のクラスパス設定は無視されます。

于 2013-07-08T16:42:22.603 に答える
4

Class-PathのエントリにJAR を追加するか、両方の JAR を CLASSPATH 変数に追加し、フラグMANIFEST.MFを使用しないでください。-jar

于 2013-07-08T16:47:27.900 に答える
0

私もこの問題を抱えていました。私は最終的に問題を回避する方法を考え出しました。したがって、以下は実際にはあなたの質問に直接対処する答えではありませんが、あなたにとってはうまくいくかもしれません.

コードを (実行するだけでなく) jar ファイルにコンパイルするスクリプトを作成しました。次のようになります (UNIX の場合):

rm filelist
find foldername | grep .java >> filelist
javac -classpath .:/path/external.jar -d ../bin @filelist

次に、jar ファイルを実行するディレクトリに、external.jar もあります。

russell@ubuntu:$ ls
external.jar myfile.jar

それは今のところうまくいくようです。

于 2013-07-08T16:48:32.250 に答える