Java jar中存在NoClassDefFoundError,但Intellij中没有
我正在尝试运行一个带有依赖项的jar。应用程序在Intellij中运行良好,但当我尝试运行jar时,我得到:Java jar中存在NoClassDefFoundError,但Intellij中没有,java,intellij-idea,gradle,jira-rest-api,Java,Intellij Idea,Gradle,Jira Rest Api,我正在尝试运行一个带有依赖项的jar。应用程序在Intellij中运行良好,但当我尝试运行jar时,我得到: >> java -jar test-0.1.0.jar Exception in thread "main" java.lang.NoClassDefFoundError: com/atlassian/httpclient/apache/httpcomponents/DefaultHttpClient at com.atlassian.jira.rest.cl
>> java -jar test-0.1.0.jar
Exception in thread "main" java.lang.NoClassDefFoundError: com/atlassian/httpclient/apache/httpcomponents/DefaultHttpClient
at com.atlassian.jira.rest.client.internal.async.AsynchronousHttpClientFactory.createClient(AsynchronousHttpClientFactory.java:53)
at com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory.create(AsynchronousJiraRestClientFactory.java:35)
at com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory.createWithBasicHttpAuthentication(AsynchronousJiraRestClientFactory.java:42)
at Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: com.atlassian.httpclient.apache.httpcomponents.DefaultHttpClient
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)
... 4 more
我的build.gradle如下所示:
group 'test'
version '1.0-SNAPSHOT'
task wrapper(type: Wrapper) {
gradleVersion = '2.9'
distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'application'
sourceCompatibility = 1.8
mainClassName = "Main"
repositories {
mavenCentral()
maven {
url 'https://maven.atlassian.com/content/repositories/atlassian-public/'
}
}
jar {
baseName = 'test'
version = '0.1.0'
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
}
manifest {
attributes 'Main-Class': 'Main'
}
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile 'com.atlassian.jira:jira-rest-java-client-parent:4.0.0'
compile 'com.atlassian.jira:jira-rest-java-client-core:4.0.0'
compile 'com.atlassian.jira:jira-rest-java-client-api:4.0.0'
compile 'com.atlassian.jira:jira-rest-java-client-plugin:3.0.0'
compile 'com.atlassian.fugue:fugue-parent:2.6.1'
compile 'com.atlassian.fugue:fugue:2.6.1'
}
我还尝试将transitive=true
添加到每个compile子句中,但没有成功。您需要
类路径是Java运行时环境搜索类和其他资源文件的路径。可以在调用JDK工具(首选方法)时使用-classpath选项或通过设置classpath环境变量来设置类搜索路径(通常简称为“classpath”)。首选-classpath选项,因为您可以为每个应用程序单独设置它,而不会影响其他应用程序,也不会让其他应用程序修改其值
更新:
默认情况下,Gradle不会将依赖项复制到构建文件夹或将其包含到jar中。有三种方法可以解决依赖性问题:
task copyDependencies(type: Copy) {
into "$buildDir/libs"
from configurations.runtime
}
你需要
类路径是Java运行时环境搜索类和其他资源文件的路径。可以在调用JDK工具(首选方法)时使用-classpath选项或通过设置classpath环境变量来设置类搜索路径(通常简称为“classpath”)。首选-classpath选项,因为您可以为每个应用程序单独设置它,而不会影响其他应用程序,也不会让其他应用程序修改其值
更新:
默认情况下,Gradle不会将依赖项复制到构建文件夹或将其包含到jar中。有三种方法可以解决依赖性问题:
task copyDependencies(type: Copy) {
into "$buildDir/libs"
from configurations.runtime
}
嗨,塔克斯。你能举个具体的例子吗?现在我正在做
java-jartest-0.1.0.jar
。应该是java-classpath-jar build\libs\test-0.1.0.jar
?是的,如果所有依赖项jar都在同一个文件夹中。我的错误!请尝试java-classpath\to\dependencies\*-jarbuild\libs\test-0.1。0.jar
我想我遗漏了什么?我不知道依赖关系在哪里。它们不应该在jar中吗?嗯,当使用-jar
开关时,类路径
被忽略。。。您可以使用java-cp build\libs\*Main
(不要忘记星号)运行jar,或者您需要在清单中定义类路径。你能举个具体的例子吗?现在我正在做java-jartest-0.1.0.jar
。应该是java-classpath-jar build\libs\test-0.1.0.jar
?是的,如果所有依赖项jar都在同一个文件夹中。我的错误!请尝试java-classpath\to\dependencies\*-jarbuild\libs\test-0.1。0.jar
我想我遗漏了什么?我不知道依赖关系在哪里。它们不应该在jar中吗?嗯,当使用-jar
开关时,类路径
被忽略。。。您可以使用java-cp build\libs\*Main
(不要忘记星号)运行jar,或者需要在清单中定义类路径。