【问题标题】:How to build executable jar using maven-jar-plugin and groovy?如何使用 maven-jar-plugin 和 groovy 构建可执行 jar?
【发布时间】:2017-03-19 08:25:52
【问题描述】:

我有一个示例应用程序,其中包含 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 有效,但我不想要一个胖 jar - 我希望排除依赖项。

【问题讨论】:

  • 你能告诉我们项目结构吗? GroovyHello 类在哪里(文件夹路径)?
  • GroovyHelloJavaHello 都位于hello-world/src/main/java/com/example/hello/

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


【解决方案1】:

我看到您关于排除依赖项的注释,这就是您不想使用 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 类放入基于目录结构的包中。我认为这在过去是有效的:不确定我是否在这里看到了错误、新功能或我记错了。

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2011-03-24
    • 2017-08-29
    • 2017-07-07
    相关资源
    最近更新 更多