2009-08-26 125 views
95

我目前使用jar-with-dependencies程序集來創建這樣一個jar。但是,我的jar的名字有點長。是否有可能重新命名Maven jar -with-dependencies?

由於這瓶正在使用RPG程序上的AS400,我想縮短,使生活更容易一點對於那些開發者。但是,除了手工,我還沒有找到一種方法來重新命名從通常的project-name-version-classifier-jar-with-dependencies.jar罐子。我想是這樣project-name-version-classifier-full.jar

反正有沒有做到這一點,而不基本上覆制JAR-具有依賴性裝配描述符,把它滿了嗎?

此外,我想繼續有沒有classpath中的jar組裝存儲在倉庫中。

我需要兩個工件。與我的分類器持有該建設的區域的罐子。具有所有依賴項的jar也包含該區域。

project-name-version-region-full.jarproject-name-version-region.jar應存放在倉庫中。在第一個例子中,分類器是區域滿的,在第二個區域。後者正在工作。

回答

168

可以指定finalName財產給罐子你想要的名稱,並指定appendAssemblyId應該是假的,以避免「罐子與 - 依賴」的後綴。

下面將輸出配置了一個名爲「Test.jar的」

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <executions> 
    <execution> 
     <id>jar-with-dependencies</id> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <finalName>test</finalName> 
     <appendAssemblyId>false</appendAssemblyId> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

更新罐子:根據您的意見,使用內置的描述符將無法正常工作。我相信這是最近版本的assembly-plugin中的一個錯誤 - 他們已經刪除了對分類器的支持,但是如果使用內置描述符,則id是固定的,因此最終會得到一個很大的daft名稱。

作爲一種變通方法,您可以複製由jar-with-dependencies描述符中使用的組件描述符和修改ID。

這個例子將導致組件ID被附加到finalName,所以如果你需要有區域full.jar的名稱,你可以指定finalName爲區域和裝配id作爲。這將導致名爲region-full.jar的目標文件,但請注意,它仍將作爲附加工件安裝到Maven存儲庫中,其中完整用作分類器。只要這個id與你的其他裝配不同,就不應該有碰撞。

pom配置看起來像這樣。

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <executions> 
    <execution> 
     <id>jar-with-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <descriptors> 
      <descriptor>src/main/assembly/jar-assembly.xml</descriptor> 
     </descriptors> 
     <finalName>region</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

和JAR-assembly.xml中的src/main /裝配這樣的:

<assembly> 
    <id>full</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
    </fileSet> 
    </fileSets> 
</assembly> 
+1

啊,appendAssemblyId,我怎麼想你。謝謝! – 2009-08-26 14:43:09

+0

致力於闡述Rich。實質上,我需要存儲兩個分類器工件。隨着appendAssemblyId打開,我有3 artifiacts,一個沒有分類器,分類器版本,和jar與依賴版本。在關閉appendAssemblyID的情況下,將uber jar安裝到非分類器版本。我需要讓這些人使用基於區域+完整的分類器來說明它們的構建位置。不幸的是,添加分類標籤不起作用。 – 2009-08-26 16:06:01

+0

只需將* appendAssemblyId *設置爲* false *即可完成作業。 允許您保留常規的最終名稱而不用重寫它。 – 2017-06-10 15:04:30

2

我要去給富國信用指着我在正確的方向,但希望發佈爲我工作的解決方案,因爲Rich's稍微關閉了:

我的jar-assembly。XML看起來像這樣這使得裝配id來改變其存儲在我的個人資料的屬性區域:

<assembly> 
    <id>${env}-full</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
    <fileSets> 
     <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     </fileSet> 
    </fileSets> 
</assembly> 

我沒有用在Maven的組裝插件設置的finalName參數,因爲這建立了我使用我的project-name-version-env-full.jar名稱進行項目,其中env-full是分類器。

想象一下,當我瞭解到組件xml可以被構建中的項目參數化時,我感到驚訝。這正是我正在尋找的。

8

感謝這裏的帖子和一些挖掘在maven docs我已經拿出了一個一般的一次性重新打包的可執行jar程序集的配置與自定義名稱。

在pom.xml中:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <id>exe</id> 
      <phase>package</phase> 
      <goals><goal>single</goal></goals> 
      <configuration> 
       <finalName>MyJarName</finalName> 
       <attach>false</attach> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
        <descriptor>assembly.xml</descriptor> 
       </descriptors> 
       <archive> 
        <manifest> 
         <mainClass>karlthepagain.MyMain</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

在assembly.xml:

<assembly> 
    <id>exe</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <unpack>true</unpack> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

這將產生MyJarName.jar及其所有依賴的重新包裝成相同的罐子和指定Main-Class: karlthepagain.MyMain

+1

這固定了我所有的問題,主要是用依賴關係重命名最終的jar。 – 2016-05-13 16:31:32

13

我想我已經找到了一種方法來直接在pom中配置它,而不需要單獨的jar-assembly.xml。

除了用artifactId和version指定finalName外,它基本上與Rich的答案相同。

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <finalName>${project.artifactId}-${project.version}-full</finalName> 
     <appendAssemblyId>false</appendAssemblyId> 
     <archive> 
      <manifest> 
       <mainClass>com.mycompany.MyMainClass</mainClass> 
      </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-my-jar-with-dependenciess</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
+0

自從你第一個答案以來,你走過了很長的一段路,那個答案對我今天依然很有幫助! ; D – vakio 2016-10-01 09:40:00

+1

我正在尋找像你一樣的解決方案,沒有單獨的jar-assembly.xml文件。謝謝... 它適用於我... – 2017-05-31 04:18:46

+0

太棒了!別客氣 :) – vikingsteve 2017-05-31 06:45:52

2

這爲我工作

<build> 
    <finalName>anynameyoulike</finalName> 
    <plugins>   
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.6</version> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs>     
       <appendAssemblyId>false</appendAssemblyId> 
       <archive> 
        <manifest> 
         <mainClass>com.mycompany.MyMainClass</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> <!-- this is used for inheritance merges --> 
        <phase>package</phase> <!-- bind to the packaging phase --> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
相關問題