gpt4 book ai didi

java - Gradle & Groovy - 错误 : Could not find or load main class

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:04 25 4
gpt4 key购买 nike

我可以使用 gradle run 运行我的项目,但我无法使用 java -jar 运行 jar 文件。我用这个示例项目重新创建了错误:link to project on GitHub

这是通过gradlew运行项目的输出

$ ./gradlew run

> Task :run
Hello world.

BUILD SUCCESSFUL in 4s

这是运行项目 java -jar

的输出
$ ./gradlew build

BUILD SUCCESSFUL in 6s

$ java -jar build/libs/emailer.jar
Error: Could not find or load main class us.company.emailer.App

但是当我解压jar时,我可以看到App.class

user@computer:../libs$ unzip emailer.jar 
Archive: emailer.jar
creating: META-INF/
inflating: META-INF/MANIFEST.MF
creating: us/
creating: us/company/
creating: us/company/emailer/
inflating: us/company/emailer/App.class

这是build.gradle

plugins {
id 'groovy'
id 'application'
}

repositories {
jcenter()
mavenCentral()
}

dependencies {
implementation 'org.codehaus.groovy:groovy-all:2.5.6'
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
compile 'org.apache.commons:commons-email:1.5'
}

mainClassName = 'us.company.emailer.App'

jar {
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
'Main-Class': 'us.company.emailer.App'
)
}
}

sourceSets.main.java.srcDirs = ['src/main/groovy']

这是 App.groovy

package us.company.emailer

class App {

String getGreeting() {
return 'Hello world.'
}

static void main(String[] args) {
println new App().greeting
}
}

编辑:添加 MANIFEST.MF 以响应@tkruse 的评论

Manifest-Version: 1.0
Class-Path: commons-email-1.5.jar javax.mail-1.5.6.jar activation-1.1.
jar
Main-Class: us.company.emailer.App

最佳答案

问题是类路径。如果您查看 META-INF/MANIFEST.mf 文件,您可以看到它设置为:

Class-Path: commons-email-1.5.jar javax.mail-1.5.6.jar activation-1.1.
jar

当 java 运行时,它不知道这些东西在哪里,它还需要 groovy 运行时才能理解你的 groovy 代码。

做到这一点的最简单方法是将所有依赖项捆绑到一个“fat-jar”中,而使用 Gradle 做到这一点的最简单方法是出色的 Shadow-jar plugin .

如果您将以下内容添加到 build.gradle 中的 plugins block 中:

    id 'com.github.johnrengelman.shadow' version '5.0.0'

(您可以删除 jar block 和操作 sourceSets 的行)

然后运行./gradlew shadowJar

你会得到一个 jar 文件 emailer-all.jar

可以运行的:

$ java -jar build/libs/emailer-all.jar
Hello world.

为了完整性,这里是完整的 build.gradle 文件:

plugins {
id 'groovy'
id 'application'
id 'com.github.johnrengelman.shadow' version '5.0.0'
}

repositories {
jcenter()
mavenCentral()
}

dependencies {
implementation 'org.codehaus.groovy:groovy-all:2.5.6'
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
implementation 'org.apache.commons:commons-email:1.5'
}

mainClassName = 'us.company.emailer.App'

关于java - Gradle & Groovy - 错误 : Could not find or load main class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55697453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com