是否可以重命名带有依赖项的Maven jar?


138

我目前正在使用jar-with-dependencies程序集来创建这样的jar。但是,我的罐子的名称有点长。

由于AS400上的RPG程序正在使用此jar,因此我想缩短它,以使这些开发人员的工作变得更轻松。但是,除了手工之外,我还没有找到一种方法来从通常的罐子中重命名罐子project-name-version-classifier-jar-with-dependencies.jar。我想要类似的东西project-name-version-classifier-full.jar

无论如何,在没有基本复制jar-with-dependencies程序集描述符并将其完全调用的情况下执行此操作吗?

另外,我想继续将没有组装的类路径的jar存储在存储库中。

我需要两个工件。具有我的分类器的jar包含构建所针对的区域。具有所有依赖项的jar,其中也包括区域。

project-name-version-region-full.jarproject-name-version-region.jar应存储在存储库中。在第一个示例中,分类器是全区域的,在第二个示例中是区域。后者正在工作。

Answers:


227

您可以指定finalName属性以为jar提供所需的名称,并指定appendAssemblyId为false以避免后缀“ jar-with-dependencies”。

下面的配置将输出一个名为“ test.jar”的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-Plug中的一个错误-他们已经删除了对分类器的支持,但是如果您使用内置描述符,则ID是固定的,因此您会以一个笨拙的名字结尾。

解决方法是,您可以复制jar-with-dependencies描述符使用的程序集描述符并修改id。

此示例将导致程序集ID附加到finalName,因此,如果您需要使用名称region-full.jar,则可以将finalName指定为region,而将程序集ID指定为full。这将在目标中生成一个名为region-full.jar的文件,但请注意,该文件仍将作为附加工件安装到Maven存储库,其中full用作分类器。只要此ID与您的其他程序集的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>

和src / main / assembly中的jar-assembly.xml像这样:

<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>

着手详细说明Rich。本质上,我需要存储两个分类器工件。启用appendAssemblyId后,我得到了3个工件,其中一个没有分类器,分类器版本和jar-with-dependencies版本。在关闭appendAssemblyID的情况下,uber jar已安装到非分类程序版本。我需要让这些人使用基于区域+完整的分类器,说明它们的构建位置。不幸的是,添加分类器标签无效。
Mike Cornell)

36

我想我已经找到了一种方法,可以直接在pom中进行配置,而无需单独的jar-assembly.xml。

它与Rich的答案基本相同,除了finalName是用artifactId和版本指定的。

<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>

8

多亏了这里的帖子和对Maven文档的一些挖掘,我为带有一次性自定义名称的一次性打包的常规可执行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所有依赖关系,并将其重新打包到同一jar和指定的jar中Main-Class: karlthepagain.MyMain


3

我要为Rich指出正确的方向而给予我荣誉,但由于Rich的销售略有下降,我想发布对我有用的解决方案:

我的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-assembly-plugin设置中使用finalName参数,因为这使用我的project-name-version-env-full.jar名称构建了我的项目,其中env-full是分类器。

想象一下,当我得知程序集xml可以由构建中的项目进行参数化时,我会感到惊讶。这正是我想要的。


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>

1

也可以使用${project.build.finalName}最终名称覆盖原始的jar文件:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.