2009-08-26 124 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> 
相关问题