jnt*_*tme 13 java noclassdeffounderror throwable gradle
我正在使用gradle作为JavaFX插件.即使在建立和运行分发之后的所有内容之后,一切都运行良好,除了一个类:CloseableHttpClient
出于几个目的,我创建了以下对象:
CloseableHttpClient client = HttpClients.createDefault();
Run Code Online (Sandbox Code Playgroud)
在IDE中运行程序没问题,一切正常.但是如果我构建并尝试运行.exe-File,我会得到以下Throwable-StackTrace:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.http.conn.ssl.SSLConnectionSocketFactory
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
at ch.itcb.tools.lom.util.JsonSimpleUtil.http(JsonSimpleUtil.java:29)...
Run Code Online (Sandbox Code Playgroud)
我真的不明白.怎么可能只是这个班级找不到,但我所有的其他班级呢?
我的build.gradle文件:
apply plugin: 'java'
apply plugin: 'eclipse'
apply from: 'javafx.plugin'
sourceCompatibility = 1.8
version = '0.1'
jar {
manifest {
attributes 'Implementation-Title': 'LogoffManager',
'Implementation-Version': version
}
}
repositories {
mavenCentral()
}
dependencies {
compile fileTree(dir: 'lib', include: ['*.jar'])
compile 'ch.qos.logback:logback-classic:1.1.3'
compile 'org.apache.httpcomponents:httpclient:4.5.1'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
test {
systemProperties 'property': 'value'
}
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要更多信息,请写评论.谢谢.
Ola*_*laf 15
这是一个很好的问题,我刚刚在研究Java开发人员最终可以获得类路径乐趣的方式的例子时遇到了这些问题:-)
我从build.gradle的最小版本开始(仅包括与之直接相关的内容),具体来说:
plugins {
id 'java'
}
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
jar {
manifest {
attributes 'Main-Class': 'com.oliverlockwood.Main'
}
}
dependencies {
compile 'org.apache.httpcomponents:httpclient:4.5.1'
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的'Main'类使用您的代码示例,即:
package com.oliverlockwood;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Main {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
在这个阶段,我可以运行gradle clean build后跟java -jar build/libs/33106520.jar(我的项目以此StackOverflow问题命名),我看到了这个:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/impl/client/HttpClients
at com.oliverlockwood.Main.main(Main.java:8)
Caused by: java.lang.ClassNotFoundException: org.apache.http.impl.client.HttpClients
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Run Code Online (Sandbox Code Playgroud)
这与你的错误略有不同,但在我们挖掘和重现之前,让我强调一下:当类加载器无法找到它需要的类时,这个错误和你所看到的错误都是在运行时引起的.有相当不错的博客文章在这里约编译时类路径和运行时类路径之间的区别的更多细节.
如果我运行,gradle dependencies我可以看到我的项目的运行时依赖项:
runtime - Runtime classpath for source set 'main'.
\--- org.apache.httpcomponents:httpclient:4.5.1
+--- org.apache.httpcomponents:httpcore:4.4.3
+--- commons-logging:commons-logging:1.2
\--- commons-codec:commons-codec:1.9
Run Code Online (Sandbox Code Playgroud)
我将这些手动逐个添加到我的运行时类路径中.(对于记录,这通常不被认为是良好的做法;但为了实验,我将这些罐子复制到我的build/libs文件夹并运行java -cp build/libs/33106520.jar:build/libs/* com.oliverlockwood.Main.有趣的是,这无法重现您的确切问题.回顾:
org.apache.httpcomponents:httpclient在运行时没有,那么我们就会失败,因为HttpClients找不到jar.org.apache.httpcomponents:httpclient:4.5.1在运行时可用,那么你的问题没有表白-我注意到,你的类构建失败找(org.apache.http.conn.ssl.SSLConnectionSocketFactory)是这同一个Apache库的一部分,这是非常可疑的确实.我怀疑你的运行时类路径包含不同版本的Apache httpclient库.由于那里有很多版本,我不打算测试每一个组合,所以我会给你留下以下建议.
compile fileTree(dir: 'lib', include: ['*.jar']).基于诸如Maven或JCenter之类的存储库的托管依赖项比随机目录中的依赖项更容易使用.如果这些是您不想发布到开源工件存储库的内部库,则可能需要设置本地Nexus实例或类似实例.build.gradle运行中,并且运行gradle clean shadow,我能够运行java -jar得很好而无需手动添加任何东西到我的类路径.| 归档时间: |
|
| 查看次数: |
24257 次 |
| 最近记录: |