簡體   English   中英

如何使用maven-jar-plugin和groovy構建可執行jar?

[英]How to build executable jar using maven-jar-plugin and groovy?

我有一個示例應用程序,其中包含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工作,但我不想要一個胖罐 - 我希望排除依賴。

我看到你關於依賴項的注釋被排除在外,這就是你不想使用maven-shaded-plugin的原因。 我不確定Groovy類的效果如何。

(但值得注意的是我自己和其他Java新手: maven-jar-plugin不包含依賴項)

第一種可能性:Java barfing是因為它找不到Groovy,真的想要它嗎?

我找到了一個關於加載從依賴類擴展的主類的能力的答案

我知道一個普通的Groovy腳本文件,沒有明確的類聲明, 編譯器將它包裝在它從(Groovy的)腳本擴展的類中 我不知道如果你編寫自己的顯式類會發生什么 - 我將解壓縮.jar並使用Java Decompiler查看生成的代碼,看看是否能給你提供任何線索。

第二種可能性:包名

關於Groovy為你創建一個類的功能,如果你沒有顯式聲明它, 似乎無法將該隱式Java類放在基於目錄結構的包中。 認為這在過去有效:不確定我是否在這里看到一個錯誤,一個新功能,或者我是否記錯了。

那么,有兩種解決方法:

  1. package聲明添加到Groovy腳本。

     package com.example.hello println "I'm Groovy!" 
  2. 讓你的maven mainClass標簽引用沒有包命名空間的類(即: GroovyHello而不是com.example.hello.GroovyHello

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM