Gradle Uber (Fat) Jar 和 java.lang.NoClassDefFoundError 在运行时
Gradle Uber (Fat) Jar and java.lang.NoClassDefFoundError in Runtime
我正在尝试使用 Gradle 创建一个 UberJar 文件。
构建和运行 jar 文件我执行命令
./gradlew clean build
java -jar build/libs/jLocalCoin-0.2.jar
然后我得到异常
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/primitives/Longs
// ... rest of stacktrace
at im.djm.zMain.Main03.main(Main03.java:13)
Caused by: java.lang.ClassNotFoundException: com.google.common.primitives.Longs
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 8 more
不明白异常的原因是什么?
我知道 Guava 库不是 jar 的一部分,但为什么呢?
在这个 questio 中,在接受的答案中,jar 文件的创建方式与我尝试的方式相同。
这是build.grade
文件
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'application'
mainClassName = 'im.djm.zMain.Main03'
archivesBaseName = 'jLocalCoin'
version = "0.2"
run {
standardInput = System.in
}
repositories {
jcenter()
}
dependencies {
implementation 'com.google.guava:guava:24.0-jre'
testImplementation 'junit:junit:4.12'
testCompile 'org.assertj:assertj-core:3.8.0'
}
jar {
manifest {
attributes "Main-Class": "$mainClassName"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
您创建的 jar 中可能没有番石榴。 NoClassDefFoundError
当您的项目在类路径中没有必需的 运行 时间依赖项时发生。我查的教程是这样创建fatJar的,
task fatJar(type: Jar) {
baseName = project.name + '-all'
manifest {
attributes 'Implementation-Title': 'Gradle Jar File Example',
'Implementation-Version': version,
'Main-Class': 'com.mkyong.DateUtils'
}
from { configurations.compile.collect { it.isDirectory() ? it :
zipTree(it) }
}
with jar
}
并将 implementation 'com.google.guava:guava:24.0-jre'
更改为 compile 'com.google.guava:guava:24.0-jre'
然后它确实在生成的 jar 中包含番石榴
和运行命令gradle fatJar
来源=https://www.mkyong.com/gradle/gradle-create-a-jar-file-with-dependencies/
我正在尝试使用 Gradle 创建一个 UberJar 文件。
构建和运行 jar 文件我执行命令
./gradlew clean build
java -jar build/libs/jLocalCoin-0.2.jar
然后我得到异常
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/primitives/Longs
// ... rest of stacktrace
at im.djm.zMain.Main03.main(Main03.java:13)
Caused by: java.lang.ClassNotFoundException: com.google.common.primitives.Longs
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 8 more
不明白异常的原因是什么?
我知道 Guava 库不是 jar 的一部分,但为什么呢?
在这个 questio 中,在接受的答案中,jar 文件的创建方式与我尝试的方式相同。
这是build.grade
文件
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'application'
mainClassName = 'im.djm.zMain.Main03'
archivesBaseName = 'jLocalCoin'
version = "0.2"
run {
standardInput = System.in
}
repositories {
jcenter()
}
dependencies {
implementation 'com.google.guava:guava:24.0-jre'
testImplementation 'junit:junit:4.12'
testCompile 'org.assertj:assertj-core:3.8.0'
}
jar {
manifest {
attributes "Main-Class": "$mainClassName"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
您创建的 jar 中可能没有番石榴。 NoClassDefFoundError
当您的项目在类路径中没有必需的 运行 时间依赖项时发生。我查的教程是这样创建fatJar的,
task fatJar(type: Jar) {
baseName = project.name + '-all'
manifest {
attributes 'Implementation-Title': 'Gradle Jar File Example',
'Implementation-Version': version,
'Main-Class': 'com.mkyong.DateUtils'
}
from { configurations.compile.collect { it.isDirectory() ? it :
zipTree(it) }
}
with jar
}
并将 implementation 'com.google.guava:guava:24.0-jre'
更改为 compile 'com.google.guava:guava:24.0-jre'
然后它确实在生成的 jar 中包含番石榴
和运行命令gradle fatJar
来源=https://www.mkyong.com/gradle/gradle-create-a-jar-file-with-dependencies/