使用 groovy 脚本创建可执行 jar

Posted

技术标签:

【中文标题】使用 groovy 脚本创建可执行 jar【英文标题】:Creating an executable jar with groovy script 【发布时间】:2016-01-18 23:17:28 【问题描述】:

我有一个时髦的脚本Automate.groovy。该脚本没有类定义或主要方法。我正在寻找创建包含脚本的 jar 的最简单方法。我尝试使用以下命令编译 groovy 脚本:

groovyc Automate.groovy

我还有一个 Manifest 文件 manifest-addition.txt 指定了主类

Main-Class: Automate

我使用以下命令创建了 jar:

jar cvfm Automate.jar mainfest-addition.txt *.class

这给了我一个带有 Automate.class 和 Automate$1.class 的 jar 以及一个带有 Main 类的 Manifest 文件。但是当我尝试使用 java -jar Automate.jar 运行 jar 时,我总是收到错误

cannot find or load main class Automate.

我在这里做错了什么?

应该有一个像这样的简单方法来创建 jar。我的 jar 中只有一个我想要的脚本文件,我不想使用 maven/ant/gradle 来完成这项工作。难道没有一种简单直接的方法可以做到这一点吗?

【问题讨论】:

【参考方案1】:

类文件依赖于 Groovy。使用可嵌入的 jar 将解决问题。

使用 Groovy 2.4.5,如果我有这个 Automate.groovy 脚本

println "Hello from Automate.groovy"

并使用此 manifest.txt:

Main-class: Automate
Class-path: jar/groovy-all-2.4.5.jar

还有这个简单的构建脚本:

rm *.class
groovyc Automate.groovy
jar cvfm Automate.jar manifest.txt Automate.class

并且,在运行目录中,我执行以下操作:

bash$ mkdir jar
bash$ cp $GROOVY_HOME/embeddable/groovy-all-2.4.5.jar jar

然后这个工作:

bash$ java -jar Automate.jar 
Hello from Automate.groovy

如果 Automate.jar 本身包含可嵌入的 jar,解决方案会更好。使用 Gradle 的示例是 this project。

【讨论】:

为什么在 Automate.jar 中包含 groovy-all jar 是一个更好的解决方案? 我实际上尝试使用 java -cp groovy-all.jar Automate.jar 在类路径中包含 groovy-all jar。即使那样我也得到了同样的错误。我实际上有一个 @Grab 注释,这实际上是导致问题的原因。当我删除它时,它能够找到主类 @Harini 要将其包含在 -classpath 中,您需要将其添加到 jar 文件中,例如:java -cp Automate.jar:groovy-all-2.4.5.jar Automate【参考方案2】:

实际的问题是我脚本中的@Grab 注释。我创建了一个 Gradle 项目并添加了一个非常简单的脚本 HelloWorld.groovy,其中只有一个 println 语句,但也使用了 @Grab 来导入一些东西。当我构建 jar 时,它找不到主类。当我四处搜索时,我发现 @Grab 注释是用于独立脚本而不是用于预编译脚本。因此,如果您需要在已编译的 groovy 中包含 @Grab,那么您需要添加一个额外的 ivy 依赖项,或者选择不包含 @Grab 并使用其他方式来包含依赖项。我从脚本中删除了@Grab,然后构建了它。 jar 执行得很好。

抱歉,我不想使用 Gradle/Maven。我几乎花了两天时间尝试所有可以在 *** 和 google 上找到的东西,最后尝试了 Gradle。我不确定这是否是解决问题的唯一方法,但这对我有用。

【讨论】:

以上是关于使用 groovy 脚本创建可执行 jar的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot:无法使用 2.0.0-M3 创建完全可执行的 jar

使用IDEA创建可执行jar

jenkins 执行可执行jar包测试中,请求乱码解决办法

大数据开发之词频统计传参打包成jar包发送到Hadoop运行并创建可执行文件方便运行

如何使用在所有平台上运行的 SWT 创建可执行 JAR?

如何使用 Maven 创建具有依赖关系的可执行 JAR?