我有一个示例应用程序,其中包含Groovy中的主类和Java中的主类。当Java类被指定为主类时,maven-jar-plugin成功构建了一个可执行jar,但是当Groovy类被指定时,则没有。让我来证明一下。这是我的构建:
<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有效,但我不想要一个胖罐子 - 我希望排除依赖。
答案 0 :(得分:0)
我看到你关于依赖项的说明被排除在外,这就是你不想使用maven-shaded-plugin的原因。我不确定Groovy类的效果如何。
(但值得明确告诉我自己和其他Java新手:maven-jar-plugin
不包含依赖项)
第一种可能性:Java barfing是因为它无法找到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类放在一个基于的包中目录结构。我想到这在过去是有用的:不确定我是否在这里看到了一个错误,一个新功能,或者我是否记错了。
所以,有两种方法可以解决这个问题:
在Groovy脚本中添加package
声明。
package com.example.hello
println "I'm Groovy!"
让您的maven mainClass
标记引用没有包名称空间的类(即:GroovyHello
而不是com.example.hello.GroovyHello