【问题标题】:Maven: Output JAR with arbitrary extensionMaven:输出具有任意扩展名的 JAR
【发布时间】:2013-09-23 22:20:46
【问题描述】:

我有一个 Java 项目,当在其上执行 mvn install 时,会生成一个 JAR 文件。到目前为止一切顺利。

在那一代之后,我想将生成的 JAR 文件重命名为具有任意扩展名的文件。例如,假设生成的 JAR 名为“Foo.jar”,我想将其重命名为“Foo.baz”

我正在尝试确定可以让我执行此操作的神奇插件组合。到目前为止,我已经根据this SO answer尝试了以下方法:

<project>
    ...
    <build>
      <finalName>Foo</finalName>
      <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <configuration>
                        <target>
                            <copy file="${project.build.directory}/${project.build.finalName}.jar"
                                  tofile="${project.build.directory}/${project.build.finalName}.baz" />
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>attach-instrumented-jar</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>attach-artifact</goal>
                    </goals>
                    <configuration>
                        <artifacts>
                            <artifact>
                                <file>${project.build.directory}/${project.build.finalName}.baz</file>
                                <type>baz</type>
                            </artifact>
                        </artifacts>
                    </configuration>
                </execution>
            </executions>
        </plugin>
      </plugins>
  </build>
  ...
</project>

所以,有两件事。首先,上述插件似乎并没有真正做任何事情。另外,我不清楚第二个插件试图完成什么。

我也尝试在汇编中与上述插件分开执行此操作,但效果并不好。我的程序集文件(注意我没有包含插件,因为它完全是样板文件):

<assembly xmlns="http://maven.apache.org/xsd/assembly"
      xsi:schemaLocation="http://maven.apache.org/xsd/assembly-1.0.0.xsd">
<id>dist</id>
<formats>
    <format>jar</format>
    <format>dir</format>
</formats>
<files>
    <file>
        <source>${project.build.directory}/${project.build.finalName}.${packaging}</source>
        <outputDirectory>${project.build.directory}</outputDirectory>
        <destName>${project.build.finalName}.baz</destName>
    </file>
</files>

</assembly>

但是,尝试运行此程序集导致:无法创建程序集:创建程序集存档 dist 时出错:zip 文件无法包含自身

所以,在这一点上,我不知所措。在谷歌搜索了大约一个小时后,我的印象是 ant 脚本是解决这个问题的方法,但我无法开始告诉你为什么它不起作用。

感谢任何帮助。

【问题讨论】:

  • 它是否必须在 maven 构建周期中,或者您可以只制作一个 bat/sh 文件来调用安装然后重命名 jar 文件吗?
  • 为什么需要对工件进行这样的重命名?
  • @ns47731 出于可移植性的原因,我需要它作为构建周期的一部分运行。

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


【解决方案1】:

Cody S. 的回答对我来说效果很好。但是,如果您不想像我一样以两个文件(*.jar 和 *.baz)结束,请尝试以下 maven 插件,它执行“重命名”,而不是“复制”。

<plugin>
    <groupId>com.coderplus.maven.plugins</groupId>
    <artifactId>copy-rename-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
        <execution>
        <id>rename-file</id>
        <phase>generate-sources</phase>
        <goals>
            <goal>rename</goal>
        </goals>
            <configuration>
                <sourceFile>${project.build.directory}/${project.build.finalName}.jar</sourceFile>
                <destinationFile>${project.build.finalName}.baz</destinationFile>
            </configuration>
        </execution>
    </executions>
</plugin>

其他使用示例(复制和/或重命名多个文件/目录)可在其网站上找到: http://coderplus.github.io/copy-rename-maven-plugin/usage.html

【讨论】:

    【解决方案2】:

    您可以使用copy-maven-plugin 将生成的文件复制或移动到新名称。

    【讨论】:

    • 这个插件最终对我的需求很有用,但并不是我所说的显而易见的设置。一个简短的例子会让你得到接受的答案。
    【解决方案3】:

    向 Heri 致敬以获得 copy-maven-plugin 提示,但是,由于如何设置它并不是很明显(即使在阅读了文档之后),我将在此处发布实际答案。

    我通过挖掘 GitHub 问题跟踪器找到了这个示例,并且通常与它进行斗争。

    请注意,由于几个 SO 问题中记录的 Sonatype aether 更改,此代码在 Maven 3.1.0 上不起作用。该插件的作者声称(截至 2013 年 8 月)下一个版本(显然是 3.0 版)将支持 Maven 3.1.0

    无论如何,插件应该配置如下:

            <plugin>
                <groupId>com.github.goldin</groupId>
                <artifactId>copy-maven-plugin</artifactId>
                <version>0.2.5</version>
                <executions>
                    <execution>
                        <id>create-archive</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <targetPath>${project.build.directory}</targetPath>
                                    <file>${project.build.directory}/${project.build.finalName}.jar</file>
                                    <destFileName>${project.build.finalName}.baz</destFileName>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
    

    上述代码的美妙之处在于,只要您指定 finalName(或者即使您不指定?我还没有测试过),这应该适用于任何项目。

    享受吧。

    【讨论】:

    • 您不必为此指定 project.build.finalName。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多