JavaGradle:向JAR文件的类路径添加类
我希望标题本身是描述性的,但为了清楚起见,我试图在问候服务中包含一个jar
(即错误处理服务.jar)。jar。在构建之后,我加入了问候服务。jar在新项目(即TestApplication)中,但在执行我得到的TestApplication时(顺便说一句,TestApplication不是gradle项目)
Exception in thread "main" java.lang.NoClassDefFoundError: co/common/exception/BaseException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
共同公司。例外BaseException是错误处理服务模块中的一个类
根据这里的question。我包括
manifest {
attributes(
"Manifest-Version": "1.0",
"Class-Path": configurations.compile.collect { it.getName() }.join(' ')
)
}
这里是构建。依赖于错误处理服务的问候服务等级
buildscript {
repositories {
mavenCentral()
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'maven'
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
compile('org.apache.commons:commons-lang3:3.0')
compile('org.apache.commons:commons-collections4:4.0')
compile('org.slf4j:slf4j-api:1.7.25')
compile('co.common:error-handling-service:1.0.0-SNAPSHOT')
testCompile("org.mockito:mockito-all:1.9.5")
testCompile('junit:junit:4.12')
}
jar {
baseName = 'greeting-service'
version = '1.0.0-SNAPSHOT'
manifest {
attributes(
"Manifest-Version": "1.0",
"Class-Path": configurations.compile.collect { it.getName() }.join(' ')
)
}
}
group = 'co.common'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
在成功构建问候服务之后,我加入了问候服务。在TestApplication中,我仍然收到了上面提到的相同异常
Manifest-Version: 1.0
Class-Path: commons-lang3-3.0.jar commons-io-2.4.jar commons-collections
4-4.0.jar slf4j-api-1.7.25.jar error-handling-service-1.0.0-SNAPSHOT.
jar commons-logging-1.1.3.jar
为什么会发生这种情况,应该怎么做
# 1 楼答案
Java中的
NoClassDefFoundError
出现在Java虚拟机无法在运行时找到编译时可用的特定类时。例如,如果我们有一个类的方法调用或访问一个类的任何静态成员,而该类在运行时不可用,那么JVM将抛出NoClassDefFoundError因此,假设你的gradle构建成功通过——我可能会得出结论,你提供了错误的
error-handling-service-1.0.0-SNAPSHOT.jar
,它不包含co/common/exception/BaseException
类你应该仔细检查这个罐子的实际内容
# 2 楼答案
不确定这是否有帮助,但如果您的错误处理服务。jar已经打包好,可以作为一个依赖项包含到您的问候服务中。jar,那么你应该把它变成一个依赖项
例如:
将以下内容添加到依赖项块:
依赖关系{ 编译文件树(目录:“lib”,包括:['*.jar']) ... }
基本上,每一天。运行构建时,放入“lib”文件夹的jar将添加到应用程序jar中