以下是我创建的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
答案 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。