Java无法从类路径加载类

Java无法从类路径加载类,java,classpath,Java,Classpath,我有一个包含以下内容的jar文件($unzip-l output.jar): 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-jaroutput.jar。请注意,已设置CLASSPATH变量 /usr/share/java/antlr3-run

我有一个包含以下内容的jar文件(
$unzip-l output.jar
):

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-jaroutput.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/antl3-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不能按预期的方式工作?

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

将jar添加到
MANIFEST.MF
类路径
条目中,或者将两个jar添加到类路径变量中,并且不使用
-jar
标志。

我也遇到了这个问题。我终于想出了规避这个问题的办法。所以,下面的答案并不能直接回答你的问题,但它可能对你有用

我编写了一个脚本,可以将代码编译(而不仅仅是运行)到jar文件中。它看起来像这样(在unix上):

然后,在我想要运行jar文件的目录中,我还有external.jar:

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

到目前为止,这似乎是可行的。

在发布了所有这些之后,我认为David的答案是需要完成的工作的简短版本。所以我应该将我想要执行的每个JAR都添加到我的类路径中?真的吗?不,您通常通过shell脚本为每个应用程序设置类路径,或者将必要的jar添加到应用程序的
MANIFEST.MF
。另一种选择是构建一个包含所有绑定的依赖项的胖jar。您的第一个建议可行,第二个可能也可行,但不切实际(至少在我的情况下)。我选择了麦克道尔的答案,因为他解释了行为,即使没有说明如何处理问题。至少,我会给你的答案+1。谢谢。
rm filelist
find foldername | grep .java >> filelist
javac -classpath .:/path/external.jar -d ../bin @filelist
russell@ubuntu:$ ls
external.jar myfile.jar