有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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打印出:

    Hello

    使用ShadowJar设置

    为了解决正确包装胖罐子的问题,可以使用ShadowJar插件。通过这种设置,捆绑的jar可以工作:

    import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
    
    group = "myapp"
    version = "0.0.1-SNAPSHOT"
    
    plugins {
        java
        application
        id("com.github.johnrengelman.shadow").version("7.0.0")
    }
    
    java {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
        withSourcesJar()
    }
    
    
    repositories {
        mavenCentral()
        maven {
            url = uri("https://mvnrepository.com/artifact/com.microsoft.azure/azure-storage")
        }
    }
    
    application() {
        mainClass.set("mypackage.Hello")
    }
    
    dependencies {
        implementation("com.azure:azure-storage-blob:12.12.0")
    }
    
    // Configure Shadow to output with normal jar file name:
    tasks.named<ShadowJar>("shadowJar").configure {
        minimize()
    }
    
    tasks {
        build {
            dependsOn(shadowJar)
        }
    }
    
    tasks.test {
        useJUnitPlatform()
    }