【发布时间】:2018-04-15 01:44:36
【问题描述】:
我正在尝试使用 Groovy 主类构建可执行 JAR。我可以让 Java 主类完全按预期运行,但是找不到 Groovy 等效项并且不会运行。
在 src/main/groovy/foo/Test.groovy 中:
package foo
public class Test { // (Yes, the public keywords here and below are redundant)
public static void main(String[] args) {
println "groovy world"
}
}
在 src/main/groovy/foo/Test2.java 中:
package foo;
public class Test2 {
public static void main(String[] args) {
System.out.println("java world");
}
}
Gradle 文件:
plugins {
id 'java'
id 'groovy'
id 'application'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
mainClassName = 'foo.Test'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.7'
}
jar {
manifest {
attributes 'Main-Class': mainClassName
}
}
我构建了一个 JAR:
$ ./gradlew build
并尝试运行它(覆盖清单 Main-Class):
$ java -cp build/libs/test-groovy-main.jar foo.Test2
java world
$ java -cp build/libs/test-groovy-main.jar foo.Test
Error: Could not find or load main class foo.Test
如果我在执行此操作时打开详细输出,在第二种情况下,我会看到“Loaded foo.Test2”,但在第一种情况下看不到“Loaded foo.Test”。
我曾认为 Groovy 源代码编译为普通的 java 类,并且确实反编译了 Test.class 文件,我可以在 public 测试类中看到 public static main(String...) 方法。我做错了什么?
我在 Ubuntu 16.04 上使用 Gradle 2.6、Java 1.8.0 和 Groovy 2.4.7。
我这里有版本控制中的测试用例:
【问题讨论】:
-
你仍然需要 groovy 运行时 jar
-
您可以使用影子插件 imperceptiblethoughts.com/shadow/#getting_started 捆绑您的 jar 和依赖项(即:groovy)
-
如果没有其他人加入,我会在几个小时内提出一个示例/答案
-
啊哈!我错过了一些东西:在我的其他项目中,我删除了一些额外的复杂性,但其中包括一个动态构建的依赖于平台的 fat-jar 任务,改编自 stackoverflow.com/questions/10986244/…
-
影子插件太棒了,那个问题不要走Uber jar路线????