无法运行 Java 程序!NoClassDefFoundError?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2865183/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Can't get java progam to run! NoClassDefFoundError?
提问by mcintyre321
I'm a .NET developer, but for my current project I need to use Google Caja, a Java project. Uh-oh!
我是 .NET 开发人员,但对于我当前的项目,我需要使用 Google Caja,一个 Java 项目。哦哦!
I've followed the guide at http://code.google.com/p/google-caja/wiki/RunningCajaon my windows machine, but can't get the program to run. The command line they suggest didn't work, so I cd'd into the ant-jars directory and tried to run plugin.jar:
我在我的 Windows 机器上遵循了http://code.google.com/p/google-caja/wiki/RunningCaja上的指南,但无法运行程序。他们建议的命令行不起作用,所以我进入 ant-jars 目录并尝试运行 plugin.jar:
D:\java\caja\svn-changes\pristine\ant-jars>java -cp . -jar pluginc.jar -i test.htm
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
at com.google.caja.plugin.PluginCompilerMain.<init>(PluginCompilerMain.java:78)
at com.google.caja.plugin.PluginCompilerMain.main(PluginCompilerMain.java:368)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
at java.net.URLClassLoader.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 2 more
Whats that all about?
那是怎么回事?
I've also tried file:///d:/java/caja/svn-changes/pristine/ant-jars/test.htm instead of test.htm. Looking at the source, it seems the file param is a Uri...
我也试过 file:///d:/java/caja/svn-changes/pristine/ant-jars/test.htm 而不是 test.htm。查看源代码,文件参数似乎是一个 Uri ...
I've also tried running IKVM on pluginc and then not worrying about java, but that came up with the ClassDefNotFoundException too...
我也试过在 pluginc 上运行 IKVM 然后不用担心 java,但这也提出了 ClassDefNotFoundException ......
thanks!
谢谢!
edit: thanks everyone for the help so far :) still stuck. please persevere with me, this might be the start of a .net developer switching to beautiful OSS technologies!
编辑:到目前为止,感谢大家的帮助:) 仍然卡住了。请和我一起坚持,这可能是 .net 开发人员转向漂亮的 OSS 技术的开始!
d:\java\caja\svn-changes\pristine\ant-jars>java -cp .\*.* com.google.caja.plugin.PluginCompilerMain
=> NoClassDefFoundError: /\commons-cli/jar
D:\java\caja\svn-changes\pristine\ant-jars>java -cp .\*.*;..\third_party\java\jakarta_commons\*.* com.google.caja.plugin.PluginCompilerMain
=> Could not find the main class: com.google.caja.plugin.PluginCompilerMain
Is there some way I can get it to run given the code in the build.xml file?
给定 build.xml 文件中的代码,有什么方法可以让它运行吗?
采纳答案by Chris
Java's trying to load the org.apache.commons.cli.ParseException class, but it can't find it. This suggests you're not setting the classpath properly.
Java 正在尝试加载 org.apache.commons.cli.ParseException 类,但找不到它。这表明您没有正确设置类路径。
That particular class comes from the Apache Commons CLI library, so have a look around for a jar named something like cli.jar or commons-cli.jar. It may be in a separate lib
directory. If there are other jars in the same place, you'll probably need to add them, too.
该特定类来自 Apache Commons CLI 库,因此请查看名为 cli.jar 或 commons-cli.jar 之类的 jar。它可能在一个单独的lib
目录中。如果同一位置还有其他罐子,您可能也需要添加它们。
Edit: looking at the build.xml file, it uses the following classpath:
编辑:查看 build.xml 文件,它使用以下类路径:
<path id="classpath.web">
<pathelement path="${third_party}/java/jsdk2.1/servlet.jar"/>
<pathelement path="${third_party}/java/jaf/activation.jar"/>
<pathelement path="${third_party}/java/javamail/mail.jar"/>
<pathelement path="${third_party}/java/jetty/lib/jetty.jar"/>
<pathelement path="${third_party}/java/jetty/lib/jetty-util.jar"/>
</path>
<path id="classpath.compile">
<path refid="classpath.web"/>
<pathelement path="${third_party}/java/jakarta_commons/commons-cli.jar"/>
<pathelement path="${third_party}/java/json_simple/json_simple.jar"/>
<pathelement path="${third_party}/java/rhino/js.jar"/>
<pathelement path="${third_party}/java/xerces/xercesImpl.jar"/>
<pathelement path="${jars}/htmlparser.jar"/>
</path>
<path id="classpath.run">
<pathelement path="${lib}"/>
<path refid="classpath.compile"/>
</path>
So you'll need to include all of those jars in the cp
argument when calling java.
因此,cp
在调用 java.lang.Object 时,您需要在参数中包含所有这些 jars 。
Edit #2: As Ash pointed out, you can't use -cp
with -jar
, so you'll need to put the pluginc.jar
on the classpath as well and manually specify the main class (so java -cp ...;pluginc.jar com.google.classname -i etc
). It'd probably be easier to get ant working than to do all of this manually ;)
编辑 #2:正如 Ash 指出的那样,您不能使用-cp
with -jar
,因此您还需要将 放在pluginc.jar
类路径上并手动指定主类(所以java -cp ...;pluginc.jar com.google.classname -i etc
)。让蚂蚁工作可能比手动完成所有这些更容易;)
回答by Ravindra Gullapalli
Try this
尝试这个
java -classpath .;%classpath%; -jar pluginc.jar -i test.htm
回答by folone
Looks like you need to put the path to ApacheCommonslibrary to your CLASSPATH.
看起来您需要将ApacheCommons库的路径放到您的CLASSPATH 中。
回答by Ash
Also note that when you use the -jar
option, all other CLASSPATH settings are ignored. See http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html:
另请注意,当您使用该-jar
选项时,所有其他 CLASSPATH 设置都将被忽略。看http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html:
When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.
使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。