我对Java和JAR文件的经验很少。我已经下载了提供给我的JAR文件,其中似乎包含所有必需的依赖项,但是当我尝试运行java -jar MyJar.jar
时,它会引发以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:420)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.HttpClient
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 3 more
JAR文件本身似乎包含MANIFEST.MF
文件中概述的所有必要依赖项:
Manifest-Version: 1.0
Rsrc-Class-Path: ./ amqp-client-5.6.0.jar jackson-core-2.9.8.jar jacks
on-databind-2.9.8.jar jackson-annotations-2.9.0.jar jackson-dataforma
t-yaml-2.9.8.jar snakeyaml-1.23.jar slf4j-api-1.7.5.jar slf4j-log4j12
-1.7.5.jar log4j-1.2.17.jar httpclient-4.5.8.jar httpcore-4.4.11.jar
commons-logging-1.2.jar commons-codec-1.11.jar
Class-Path: .
Rsrc-Main-Class: TRECISExternalClient
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
我想知道我是否缺少某些东西,或者是否有某些畸形的东西。愿意在需要时提供更多信息。
答案 0 :(得分:0)
您可以在下面的链接中检查类org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
的完整实现
请参考第47行if (rsrcPath.endsWith("/"))
,我认为您必须用./
分隔每个罐子。此外,我看到/
中的斜杠Rsrc-Class-Path: ./ amqp-client-5.6.0.jar
后在此行中有一个空格。它应该是Rsrc-Class-Path: ./amqp-client-5.6.0.jar
。根据图像,HttpClient
已经可用。
答案 1 :(得分:0)
事实证明,问题并不出在JAR文件本身上,而是我的系统上有多个版本的OpenJDK。清除其他版本并重新安装OpenJDK v1.8.0(在Ubuntu仓库上为openjdk-8-jdk)可以解决此问题。