代码之家  ›  专栏  ›  技术社区  ›  Mike Cornell

是否可以用依赖项重命名maven jar?

  •  111
  • Mike Cornell  · 技术社区  · 15 年前

    我目前正在使用带有依赖项程序集的JAR来创建这样的JAR。不过,我的罐子名字有点长。

    由于这个jar正被AS400上的RPG程序使用,所以我想缩短它,使那些开发人员的生活更容易一些。但是,除了用手,我还没有找到一种方法将罐子从通常的名称中重新命名。 project-name-version-classifier-jar-with-dependencies.jar . 我想要类似的东西 project-name-version-classifier-full.jar

    是否有必要在不复制带有依赖项程序集描述符的JAR并将其调用为完整的情况下执行此操作?

    另外,我想继续让JAR在存储库中存储不组装类路径的情况下。

    我需要两件艺术品。带有分类器的jar保存了构建所针对的区域。包含所有依赖项的JAR,这些依赖项还包括区域。

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

    5 回复  |  直到 15 年前
        1
  •  193
  •   Rich Seller    15 年前

    您可以指定 终名 属性为jar指定所需的名称,并指定 附件程序集ID 应为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>
    

    更新:根据您的评论,使用内置描述符是行不通的。我认为这是由于程序集插件的最新版本中的一个bug引起的——它们已经取消了对分类器的支持,但是如果使用内置描述符,则ID是固定的,因此最终会得到一个愚蠢的名字。

    作为解决方法,您可以复制 jar-with-dependencies 描述符并修改ID。

    此示例将导致程序集ID附加到finalname,因此,如果需要的名称为 环满 ,可以将finalname指定为 区域 程序集ID为 满的 . 这将在目标中生成一个名为region-full.jar的文件,但请注意,它仍将作为附加项目安装到maven存储库中。 满的 用作分类器。只要这个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>
    
        2
  •  24
  •   vikingsteve    7 年前

    我想我已经找到了一种在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>
    
        3
  •  8
  •   Karl the Pagan    13 年前

    多亏了这里的柱子和一些挖掘 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
  •  3
  •   Mike Cornell    15 年前

    我要赞扬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程序集插件设置中使用finalname参数,因为它用我的项目名version-env-full.jar name构建了我的项目,其中env full是分类器。

    想象一下,当我得知程序集XML可以由构建中的项参数化时,我的惊讶。这正是我要找的。

        5
  •  2
  •   umesh9883    8 年前

    这对我有用

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