【问题标题】:Is it possible to rename a maven jar-with-dependencies?是否可以重命名 maven jar-with-dependencies?
【发布时间】:2010-11-23 00:41:43
【问题描述】:

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

由于这个 jar 被 AS400 上的 RPG 程序使用,我想缩短它以使这些开发人员的生活更轻松一些。但是,除了手动之外,我还没有找到从通常的project-name-version-classifier-jar-with-dependencies.jar 重命名 jar 的方法。我想要project-name-version-classifier-full.jar 之类的东西

在基本上不复制 jar-with-dependencies 程序集描述符并将其称为 full 的情况下,有没有办法做到这一点?

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

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

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

【问题讨论】:

    标签: java maven-2 jar maven-assembly-plugin


    【解决方案1】:

    您可以指定 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>
    

    更新:根据您的 cmets,使用内置描述符将不起作用。我相信这归结为最新版本的程序集插件中的一个错误 - 他们已经删除了对分类器的支持,但是如果你使用内置描述符,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 安装到非分类器版本。我需要让这些人使用基于区域+完整的分类器来说明它们的构建位置。不幸的是,添加分类器标签不起作用。
    • 谢谢,我用的是 ${artifactId}-${version}-fat,真是乱七八糟的文档
    【解决方案2】:

    我要感谢 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 可以通过构建中的项目参数化时,想象一下我的惊讶。这正是我想要的。

    【讨论】:

      【解决方案3】:

      感谢这里的帖子和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,并将其所有依赖项重新打包到同一个jar和指定的Main-Class: karlthepagain.MyMain中。

      【讨论】:

        【解决方案4】:

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

        和 Rich 的回答基本一样,只不过 finalName 是用 artifactId 和 version 指定的。

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

        【讨论】:

          【解决方案5】:

          这对我有用

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

          【讨论】:

            【解决方案6】:

            也可以使用${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>
            

            【讨论】:

            • 这行得通。要突出显示的重要行是“${project.build.finalName}false
            猜你喜欢
            • 2012-01-31
            • 2011-07-13
            • 1970-01-01
            • 1970-01-01
            • 2016-03-15
            • 1970-01-01
            • 2011-06-28
            • 1970-01-01
            • 2011-08-06
            相关资源
            最近更新 更多