java Gradle Kotlin DSL:无法找到或加载主类
我有一个具有多个依赖项的Java项目,我想使用Kotlin DSL与Gradle一起打包到一个胖罐子中
当我运行./gradlew jar
时,构建成功,但当我尝试运行它时,它找不到主类:
$ ./gradlew jar
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
$ java -jar build/libs/myapp-0.0.1-SNAPSHOT.jar
Error: Could not find or load main class mypackage.Hello
Caused by: java.lang.ClassNotFoundException: mypackage.Hello
$ jar xf build/libs/myapp-0.0.1-SNAPSHOT.jar META-INF/MANIFEST.MF
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Main-Class: mypackage.Hello
$ jar -tf build/libs/myapp-0.0.1-SNAPSHOT.jar | grep mypackage 1
mypackage/
mypackage/Hello.class
以下是完整的build.gradle.kts
文件:
group = "myapp"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
withSourcesJar()
}
plugins {
java
}
repositories {
mavenCentral()
maven {
url = uri("https://mvnrepository.com/artifact/com.microsoft.azure/azure-storage")
}
}
dependencies {
implementation("com.azure:azure-storage-blob:12.12.0")
}
val mainClassName = "mypackage.Hello"
tasks.jar {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
manifest.attributes.apply {
put("Class-Path", configurations.runtimeClasspath.get().asPath)
put("Main-Class", mainClassName)
}
from(configurations.compileClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
}
tasks.test {
useJUnitPlatform()
}
还有我的回购的链接:https://github.com/darkasphalt/myapp
# 1 楼答案
检查罐子里的东西。问题是,您包含了LIB的所有内容。这还添加了来自java模块系统的文件,比如
module-info.class
。这可能会隐藏你的主类简单修复
你的主要作品,如果你:
a)删除导入
implementation("com.azure:azure-storage-blob:12.12.0")
或
b) 删除类路径配置:
from(configurations.compileClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
然后用一个简单的
java -jar myapp-0.0.1-SNAPSHOT.jar
打印出:使用ShadowJar设置
为了解决正确包装胖罐子的问题,可以使用ShadowJar插件。通过这种设置,捆绑的jar可以工作: