Jar 文件给出 java.lang.NoClassDefFoundError

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19400561/
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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 16:50:01  来源:igfitidea点击:

Jar file gives java.lang.NoClassDefFoundError

javaeclipsejar

提问by Snels Nick

I have an Eclipse project that runs fine when I run it in Eclipse. I have created a Jar file in Eclipse. But when I run it using the following command:

我有一个 Eclipse 项目,当我在 Eclipse 中运行它时运行良好。我在 Eclipse 中创建了一个 Jar 文件。但是当我使用以下命令运行它时:

D:\Java\projects\fetch>java -Xss1000m -XX:-UseGCOverheadLimit -Xmx5048m -jar bin\fetch.jar

I get the following error:

我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: info/monitorenter/cpdetector/io/ICodepageDetector
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getMethod0(Unknown Source)
    at java.lang.Class.getMethod(Unknown Source)
    at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: info.monitorenter.cpdetector.io.ICodepageDetector
    at java.net.URLClassLoader.run(Unknown Source)
    at java.net.URLClassLoader.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 6 more

The contents of the jar are:

罐子的内容是:

com (folder)
dist (folder)
doc (folder)
lib  (folder, contains all the jars, including the cpdetector jar)
META-INF (folder)
resources (folder)
sources (folder)
.classpath (file)
.project (file)
hibernate.cfg.xml (file)
log4j.xml (file)

The contents of the .classpath file are:

.classpath 文件的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="lib" path="D:/Java/projects/boilerpipe-master/target/boilerpipe-core-1.2.2.jar"/>
<classpathentry kind="lib" path="D:/Java/projects/boilerpipe-master/target/boilerpipe-core-1.2.2-jar-with-dependencies.jar"/>
<classpathentry kind="lib" path="lib/jsoup-1.7.2.jar"/>
<classpathentry kind="lib" path="lib/ahocorasick-1.4-SNAPSHOT-all.jar"/>
<classpathentry kind="lib" path="lib/ahocorasick-1.4-SNAPSHOT.jar"/>
<classpathentry kind="lib" path="lib/antlr-3.4-complete.jar"/>
<classpathentry kind="lib" path="lib/chardet.jar"/>
<classpathentry kind="lib" path="lib/commons-fileupload-1.2.2.jar"/>
<classpathentry kind="lib" path="lib/commons-httpclient-3.1.jar"/>
<classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
<classpathentry kind="lib" path="lib/commons-lang-2.6.jar"/>
<classpathentry kind="lib" path="lib/commons-lang3-3.1.jar"/>
<classpathentry kind="lib" path="lib/commons-validator-1.4.0.jar"/>
<classpathentry kind="lib" path="lib/horrorss-2.2.0.jar"/>
<classpathentry kind="lib" path="lib/Hymanson-core-2.1.4.jar"/>
<classpathentry kind="lib" path="lib/Hymanson-core-asl-1.9.12.jar"/>
<classpathentry kind="lib" path="lib/Hymanson-mapper-asl-1.9.12.jar"/>
<classpathentry kind="lib" path="lib/jdom-1.1.3.jar"/>
<classpathentry kind="lib" path="lib/jdom-2.0.4.jar"/>
<classpathentry kind="lib" path="lib/jericho-html-3.3.jar"/>
<classpathentry kind="lib" path="lib/jline.jar"/>
<classpathentry kind="lib" path="lib/joda-time-2.2.jar"/>
<classpathentry kind="lib" path="lib/lucene-analyzers-3.6.2.jar"/>
<classpathentry kind="lib" path="lib/lucene-core-3.6.2.jar"/>
<classpathentry kind="lib" path="lib/nekohtml-1.9.13.jar"/>
<classpathentry kind="lib" path="lib/rome-1.0.jar"/>
<classpathentry kind="lib" path="lib/tika-app-1.3.jar"/>
<classpathentry kind="lib" path="lib/xerces-2.9.1.jar"/>
<classpathentry kind="lib" path="lib/xstream-1.4.4.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/envers/hibernate-envers-4.2.0.Final.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/jpa/hibernate-entitymanager-4.2.0.Final.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/antlr-2.7.7.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/dom4j-1.6.1.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/hibernate-commons-annotations-4.0.1.Final.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/hibernate-core-4.2.0.Final.jar" sourcepath="C:/Users/Nick/.m2/repository/org/hibernate/hibernate-core/4.2.0.Final/hibernate-core-4.2.0.Final-sources.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/hibernate-jpa-2.0-api-1.0.1.Final.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/javassist-3.15.0-GA.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/jboss-logging-3.1.0.GA.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/required/jboss-transaction-api_1.1_spec-1.0.0.Final.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/optional/ehcache/ehcache-core-2.4.3.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/optional/ehcache/hibernate-ehcache-4.2.0.Final.jar"/>
<classpathentry kind="lib" path="lib/hibernate-release-4.2.0.Final/optional/ehcache/slf4j-api-1.6.1.jar"/>
<classpathentry kind="lib" path="C:/java/tomcat6/tomcat 6.0.35/lib/mysql-connector-java-5.1.22-bin.jar"/>
<classpathentry kind="lib" path="lib/htmlcleaner-2.4.jar"/>
<classpathentry kind="lib" path="lib/freebase-java-1.0.0.jar"/>
<classpathentry kind="lib" path="lib/javax.mail.jar"/>
<classpathentry kind="lib" path="lib/opencsv-2.3.jar"/>
<classpathentry kind="lib" path="lib/google-api-client-1.14.1-beta.jar"/>
<classpathentry kind="lib" path="lib/google-http-client-1.14.1-beta.jar"/>
<classpathentry kind="lib" path="lib/json-simple-1.1.1.jar"/>
<classpathentry kind="lib" path="lib/json-smart-1.1.jar"/>
<classpathentry kind="lib" path="lib/javatuples-1.2.jar"/>
<classpathentry kind="lib" path="lib/json-path-0.8.1.jar" sourcepath="C:/Users/Nick/.m2/repository/com/jayway/jsonpath/json-path/0.8.1/json-path-0.8.1-sources.jar"/>
<classpathentry kind="lib" path="lib/json-20090211.jar"/>
<classpathentry kind="lib" path="lib/lucene-4.3.0/core/lucene-core-4.3.0.jar"/>
<classpathentry kind="lib" path="lib/lucene-4.3.0/suggest/lucene-suggest-4.3.0.jar"/>
<classpathentry kind="lib" path="lib/solr-core-4.2.1.jar"/>
<classpathentry kind="lib" path="lib/solr-solrj-4.2.1.jar"/>
<classpathentry kind="lib" path="lib/quartz-all-2.1.7.jar"/>
<classpathentry kind="lib" path="lib/simplelatlng-1.2.0.jar"/>
<classpathentry kind="lib" path="lib/obsidian.jar"/>
<classpathentry kind="lib" path="lib/CareerjetAPIClient.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/>
<classpathentry kind="lib" path="lib/goose-2.1.22-jar-with-dependencies.jar"/>
<classpathentry kind="con" path="com.ateji.bldt.ui.ATEJILIB_CONTAINER"/>
<classpathentry kind="lib" path="lib/commons-lang-2.4.jar"/>
<classpathentry kind="lib" path="lib/commons-logging-1.0.4.jar"/>
<classpathentry kind="lib" path="lib/httpclient-4.2.3.jar"/>
<classpathentry kind="lib" path="lib/httpcore-4.2.2.jar"/>
<classpathentry kind="lib" path="lib/httpmime-4.2.3.jar"/>
<classpathentry kind="lib" path="lib/commons-codec-1.2.jar"/>
<classpathentry kind="lib" path="lib/commons-math3-3.2.jar" sourcepath="sources"/>
<classpathentry kind="lib" path="lib/guava-14.0.1.jar"/>
<classpathentry kind="lib" path="lib/cpdetector_1.0.10.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

I have already googled java.lang.NoClassDefFoundError , and have already tried a lot of stuff but none of them work. All suggestions are welcome. Thank you.

我已经在 google 上搜索了 java.lang.NoClassDefFoundError ,并且已经尝试了很多东西,但它们都不起作用。欢迎提出所有建议。谢谢你。

采纳答案by René Link

You have to provide the classpath when you run java on the command line.

在命令行上运行 java 时必须提供类路径。

java -cp lib/commons-fileupload-1.2.2.jar;......

or you run it within eclipse (Launch Configuration) and eclipse provides the classpath for you. The .classpath file is an eclipse artifact and thus only recognized by eclipse.

或者您在 eclipse(启动配置)中运行它,eclipse 为您提供类路径。.classpath 文件是一个 eclipse 工件,因此只能被 eclipse 识别。

Or you can use eclipse's runnable jar export. Export -> Runnable Jar File. Ensure that you selected "Extract required libraries into generated JAR" in the Library handling section of the export dialog.

或者你可以使用eclipse 的 runnable jar exportExport -> Runnable Jar File. 确保您在导出对话框的库处理部分中选择了“将所需的库提取到生成的 JAR 中”。

回答by Joeri Hendrickx

When running as a jar, you need to specify the classpath as follows:

作为jar运行时,需要指定classpath如下:

java -cp libOne.jar;libTwo.jar;... -jar myJar.jar

Alternatively, since you did an Eclipse export, select export Runnable Jar. You then have the option to Extract required libraries into generated JAR. Make sure, if you do this, that the license of these libraries allow you to do this. Then you don't need to specify the classpath.

或者,由于您执行了 Eclipse 导出,因此选择 export Runnable Jar。然后,您可以选择Extract required libraries into generated JAR. 如果您这样做,请确保这些库的许可允许您这样做。那么你不需要指定类路径。

A jar that was exported like this is easier to use.

像这样导出的 jar 更易于使用。