当前位置: 首页 > 知识库问答 >
问题:

Gradle静态编程语言DSL:无法找到或加载主类

雷逸仙
2023-03-14

我有一个具有多个依赖项的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

以下是完整的构建。格雷德尔。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个答案

夔高寒
2023-03-14

检查jar的内容。问题是,您包含了库的所有内容。这也会从java模块系统中添加文件,如module-info.class。这可能会隐藏您的Main类。

您的主要作品,如果您:

a)删除导入
实现("com.azure: azure-storage-blob: 12.12.0")

b)删除类路径配置:
从(configurations.compileClasspath.get(). map{if() })

而不是一个简单的java-jar-myapp-0.0.1-SNAPSHOT。jar将打印出:

你好

为了解决正确包装胖罐子的问题,可以使用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()
}

 类似资料:
  • 问题内容: 我正在尝试使用Gradle运行一个非常简单的项目,并在使用时遇到以下错误: 这是我的文件结构: 我排除了libs和tmp文件夹的内容,因为我认为这与该问题无关,但是我可以在需要时添加它。 这是我的build.gradle文件: 关于如何解决此问题的任何想法?我已经为mainClassName属性尝试了各种方法,但似乎没有任何效果。 问题答案: 我在这里看到两个问题,一个与另一个有关。

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我试图复制Spring Boot Kotlin示例项目https://github.com/jetbrains/kotlin-examples/tree/master/tutorials/spring-boot-restful。我添加了更多的依赖项,当我试图构建可执行jar并运行它时,我得到了错误:

  • 为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D

  • 我遇到一个问题,gradle fatJar/uberJar在尝试运行jar时导致以下异常: 简单的jar任务 没有问题(直到它开始需要依赖项)。 我假设这与我的一个依赖项更改类路径有关,但我不确定为什么会发生这种情况。 build.gradle的相关部分 Gradle构建文件在这里(与代码的其余部分): https://github.com/domhauton/membraned/blob/mas

  • 正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创