2

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

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

我正在尝试确定可以让我执行此操作的神奇插件组合。到目前为止,我已经尝试了以下,基于这个SO 答案:

<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 脚本是解决这个问题的方法,但我无法开始告诉你为什么它不起作用。

任何帮助表示赞赏。

4

3 回答 3

3

Cody S. answer 对我来说效果很好。但是,如果您不想以两个文件(*.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

于 2017-01-10T02:42:10.190 回答
1

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

于 2013-09-24T11:53:03.817 回答
1

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

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

请注意,此代码在 Maven 3.1.0 上不起作用,因为在几个 SO 问题中记录了 Sonatype aether 更改。该插件的作者声称(截至 13 年 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(或者即使您不指定?我还没有测试过),这应该适用于任何项目。

享受。

于 2013-09-24T17:31:53.080 回答