如何使用maven-jar-plugin和groovy构建可执行jar?

时间:2016-11-05 16:42:28

标签: java maven groovy jar maven-jar-plugin

我有一个示例应用程序,其中包含Groovy中的主类和J​​ava中的主类。当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有效,但我不想要一个胖罐子 - 我希望排除依赖。

1 个答案:

答案 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类放在一个基于的包中目录结构。我想到这在过去是有用的:不确定我是否在这里看到了一个错误,一个新功能,或者我是否记错了。

所以,有两种方法可以解决这个问题:

  1. 在Groovy脚本中添加package声明。

    package com.example.hello
    println "I'm Groovy!"
    
  2. 让您的maven mainClass标记引用没有包名称空间的类(即:GroovyHello而不是com.example.hello.GroovyHello