NoClassDefFoundError即使JAR包含在Manifest Class-Path中

时间:2016-02-28 14:09:53

标签: java jar

以下是我创建的jar的清单文件。

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Arun
Class-Path: lib/httpclient-4.5.1.jar lib/httpcore-4.4.3.jar lib/c
 ommons-logging-1.2.jar lib/commons-codec-1.9.jar lib/httpmime-4.5.1.j
 ar lib/json-simple-1.1.1.jar lib/junit-4.10.jar lib/hamcrest-core-1.1
 .jar
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_72
Main-Class: org.wso2.ml.driver.Shell

虽然Class-Path条目显示它在jar的lib文件夹中添加了必要的jar,但是当我运行这个可执行jar时,我得到一个Noclassdeffound错误。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/entity/mime/content/ContentBody

这就是我执行jar的方式

java -jar restclient-1.0-SNAPSHOT.jar

2 个答案:

答案 0 :(得分:2)

  

虽然Class-Path条目显示它已经在jar的lib文件夹中添加了必要的jar文件

Java不会在jar文件中查找jar文件 。它在罐子旁边找 。所以你需要这个文件/目录结构:

restclient-1.0-SNAPSHOT.jar
lib/
  httpclient-4.5.1.jar 
  httpcore-4.4.3.jar
  ...

此外,在运行时依赖项中使用junit和hamcrest似乎并不正确。这些应该由测试代码使用,而不是生产代码。

答案 1 :(得分:1)

我认为这个错误是你似乎在做的假设:

  

虽然Class-Path条目显示它已在jar 的lib文件夹中添加了必要的jar,但

我假设您已将这些Class-Path JAR放入restclient-1.0-SNAPSHOT.jar本身,否则您就不会遇到此问题。

如果您看到JAR file tutorial,则会明确提到以下内容:

  

注意:Class-Path标头指向本地网络上的类或JAR文件,而不是JAR文件中的JAR文件或可通过Internet协议访问的类。要将JAR文件中的JAR文件中的类加载到类路径中,必须编写自定义代码来加载这些类。例如,如果MyJar.jar包含另一个名为MyUtils.jar的JAR文件,则不能使用MyJar.jar清单中的Class-Path标头将MyUtils.jar中的类加载到类路径中。

您应该在本地文件夹上提供其他JAR文件。如果你喜欢Maven,也许可以考虑使用maven shade plugin