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

如果按照文档使用 -jar 开关,则忽略其他类路径设置。

于 2013-07-08T16:42:22.603 回答
4

将 JAR 添加到 的Class-Path条目中MANIFEST.MF,或者将两个 JAR 添加到您的 CLASSPATH 变量中并且不要使用该-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 回答