我有一个示例应用程序,其中有一个 Groovy 中的主类和 Java 中的主类。当 Java 类被指定为主类时,maven-jar-plugin 会成功构建可执行 jar,但当 Groovy 类被指定为主类时,maven-jar-plugin 会成功构建可执行 jar。让我演示一下。这是我的构建:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.hello.JavaHello</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<compilerId>groovy-eclipse-compiler</compilerId>
<verbose>false</verbose>
<source>${java.compiler.version}</source>
<target>${java.compiler.version}</target>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>${groovy-eclipse-compiler.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-batch</artifactId>
<version>2.4.3-01</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
然后编译并运行:
$ mvn -q clean package && \
> jar xf target/hello-world-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF && \
> cat META-INF/MANIFEST.MF && rm -r META-INF && \
> java -jar target/hello-world-1.0-SNAPSHOT.jar
Manifest-Version: 1.0
Built-By: tytk
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_66
Main-Class: com.example.hello.JavaHello
Hello from Java!
然后,将 mainClass
更改为:
<mainClass>com.example.hello.GroovyHello</mainClass>
并运行相同的命令:
$ mvn -q clean package && \
> jar xf target/hello-world-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF && \
> cat META-INF/MANIFEST.MF && rm -r META-INF && \
> java -jar target/hello-world-1.0-SNAPSHOT.jar
Manifest-Version: 1.0
Built-By: tytk
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_66
Main-Class: com.example.hello.GroovyHello
Error: Could not find or load main class com.example.hello.GroovyHello
每个类只有一个带有 println 语句的 main 方法。
那么如何使用我的 groovy 类获得可执行 jar 呢? maven-shade-plugin 可以工作,但我不想要一个 fat jar 子 - 我想要排除依赖项。
最佳答案
我看到您关于排除依赖项的注释,这就是您不想使用 maven-shaded-plugin 的原因。我不确定这对于 Groovy 类来说效果如何。
(但值得注意的是我自己和其他 Java 新手:maven-jar-plugin
不包含依赖项)
第一种可能性:Java 是否因为找不到 Groovy 而真正想要它而呕吐?
我找到了SO answer about ability to load main classes that extend from dependent classes 。
我知道一个普通的 Groovy 脚本文件,没有显式的类声明,compiler wraps that up in a class it extends from (Groovy's) Script 。我不知道如果您编写自己的显式类会发生什么 - 我会解压 .jar 并使用 Java Decompiler查看生成的代码,看看是否能给您任何线索。
第二种可能性:包名称
如果您没有显式声明一个类,Groovy 会为您创建一个类,该功能似乎无法根据目录结构将该隐式 Java 类放入包中。我认为这在过去是有效的:不确定我是否在这里看到了错误、新功能,或者我是否记错了。
因此,有两种方法可以解决此问题:
将
package
声明添加到您的 Groovy 脚本中。package com.example.hello println "I'm Groovy!"
让您的 maven
mainClass
标记引用没有包命名空间的类(即:GroovyHello
而不是com.example.hello.GroovyHello
关于java - 如何使用 maven-jar-plugin 和 groovy 构建可执行 jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440695/