【问题标题】:Why won't my Groovy main class execute from the built jar?为什么我的 Groovy 主类不能从构建的 jar 中执行?
【发布时间】: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。

我这里有版本控制中的测试用例:

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

【问题讨论】:

  • 你仍然需要 groovy 运行时 jar
  • 您可以使用影子插件 imperceptiblethoughts.com/shadow/#getting_started 捆绑您的 jar 和依赖项(即:groovy)
  • 如果没有其他人加入,我会在几个小时内提出一个示例/答案
  • 啊哈!我错过了一些东西:在我的其他项目中,我删除了一些额外的复杂性,但其中包括一个动态构建的依赖于平台的 fat-jar 任务,改编自 stackoverflow.com/questions/10986244/…
  • 影子插件太棒了,那个问题不要走Uber jar路线????

标签: gradle groovy jar


【解决方案1】:

添加 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

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

【讨论】:

  • 我本来打算回答我自己的问题,但如果有人帮我做这件事,最好打勾:)。
  • 在简单的情况下工作,但请注意,我在 uberjars 上找到的 SO 答案说,在尝试使用签名的这种方法时,您需要从 META_INF 目录中排除 .SF、.RSA 和 .DSA 文件扩展名jars,否则你会遇到这个问题:discuss.gradle.org/t/…
猜你喜欢
  • 1970-01-01
  • 2020-12-02
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 2016-09-29
相关资源
最近更新 更多