为什么我的Groovy主类不会从构建的jar中执行?

时间:2018-03-20 13:12:52

标签: gradle groovy jar

我正在尝试使用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 static main(String...) Test类中看到public方法。我做错了什么?

我在Ubuntu 16.04上使用Gradle 2.6,Java 1.8.0和Groovy 2.4.7。

我在版本控制中有测试用例:

https://github.com/wu-lee/test-groovy-main

1 个答案:

答案 0 :(得分:2)

从部分添加为我工作:

jar {
    manifest {
        attributes 'Main-Class': mainClassName
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

它将org.codehaus.groovy:groovy-all:2.4.7依赖项放到你的jar中。

<强> UPD

创建了拉取请求https://github.com/wu-lee/test-groovy-main/pull/1