Gradle 为什么赢了';我的Groovy主类不是从构建的jar执行的吗?
我试图用Groovy主类构建一个可执行JAR。我可以让一个Java主类完全按照预期运行,但是Groovy等价物就是找不到,也不会运行 在src/main/groovy/foo/Test.groovy中:Gradle 为什么赢了';我的Groovy主类不是从构建的jar执行的吗?,gradle,groovy,jar,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) { pri
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");
}
}
渐变文件:
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
}
}
我建造了一个罐子:
$ ./gradlew build
并尝试运行它(覆盖清单主类):
如果在执行此操作时打开详细输出,则在第二种情况下,我会看到“Loaded foo.Test2”,但在第一种情况下不会看到“Loaded foo.Test”
我原以为Groovy源代码可以编译成普通的java类,实际上,在反编译Test.class文件时,我可以在public
测试类中看到public static main(String…
方法。我做错了什么
我正在Ubuntu 16.04上使用Gradle2.6、Java1.8.0和Groovy2.4.7
我在这里有版本控制中的测试用例:
添加from部分对我有用:
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
创建了一个拉请求您仍然需要groovy运行时jar。您可以使用shadow插件捆绑jar和依赖项(即:groovy)。如果没有其他人跳过,我会在几个小时内给出一个示例/答案!我错过了一些东西:在我的其他项目中,我已经删除了一些额外的复杂性,但其中包括一个动态构建的依赖于平台的胖jar任务,改编自shadow插件,这太棒了,不要走Uber-jar路线在这个问题上,我要回答我自己的问题,但是,为我做这件事给某人打勾会更好:)。在简单的情况下有效,但是请注意,我在uberjars上找到的答案是,在使用签名JAR尝试这种方法时,需要从META_INF目录中排除.SF、.RSA和.DSA文件扩展名,否则会遇到以下问题:
jar {
manifest {
attributes 'Main-Class': mainClassName
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}