我有以下问题:我正在使用带有gradle的IntelliJ Idea。我可以毫无问题地构建jar,但是我在使用 java -jar 执行jar时遇到无法找到或加载主类的错误。
我不认为它是版本冲突,因为IDE中的java版本与我在控制台中使用的版本匹配。
代码的路径是gradle项目的标准路径,所以src / main / java。 build.gradle 的有趣部分如下所示:
jar {
manifest {
attributes 'Implementation-Title': 'Implementation_Group_C',
'Implementation-Version': version,
'Main-Class': 'EchoServer'
}
from sourceSets.main.output
}
task fatJar(type: Jar){
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtime.collect{it.isDirectory() ? it : zipTree(it)}
} {
exclude 'META_INF/*.SF'
exclude 'META_INF/*.DSA'
exclude 'META_INF/*.RSA'
}
with jar
}
当我检查jar时,我发现EchoServer.class位于主目录中(应该是正确的,因为它的目录是 /src/main/java/EchoServer.java )和META-INF / MANIFEST.MF看起来像这样:
Manifest-Version: 1.0
Implementation-Title: Implementation_Group_C
Implementation-Version: 1.1-SNAPSHOT
Main-Class: EchoServer
对我来说很好看,但我仍然得到无法找到或加载主类的错误。 如果有人能帮助我,我会非常感激。
答案 0 :(得分:1)
EchoServer(它真的不应该在默认包中,BTW:这是不好的做法)似乎依赖于库中的类,但这些库不在类路径中。因此无法加载课程。
Java在jar文件中加载 NOT 加载jar文件。它从jar文件的外部加载类,如果它们在类路径中:
java -cp yourjar.jar:library1.jar:library2.jar EchoServer
java -jar yourjar.jar
,如果在清单内的类路径中指定了库。请参阅https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html 因此,简而言之,胖jar无法工作,除非jar文件中的主类是一个自定义类加载器,它从bundle jar文件中读取其他类。请注意,gradle有一个应用程序插件,用于创建标准Java应用程序zip文件,包含启动应用程序的所有库和脚本。