maven shaded jar:更改输出位置

Posted

技术标签:

【中文标题】maven shaded jar:更改输出位置【英文标题】:maven shaded jar: change output location 【发布时间】:2016-05-22 19:51:40 【问题描述】:

我在使用 Maven Shade 插件时遇到困难,因为我想将我的阴影 jar 安装到与父 pom 相同的文件夹(而不是本地 src/target 目录)。

布局: maven_project

guide/
   parent_pom.xml
projA/
   pom.xml
projB/
   pom.xml
   /target
      original-projB-0.0.3.jar
      projB-0.0.3.jar (shaded jar) 

我必须导出项目并让其他人更容易运行可执行 jar 我想将阴影 jar 重新定位到 guide 文件夹。

不幸的是,我尝试使用

<outputDirectory>/home/name/Desktop/maven_project/guide/</outputDirectory>    

但这只是将 original-jar 移动到目录中。

问题:关于如何将阴影 jar 移到那里(甚至在此过程中删除原始 jar)有什么想法吗?

【问题讨论】:

您是否配置了 Jar 插件或 Shade 插件的 outputDirectory 条目? 你应该改变的是that outputDirectory。旁注:硬编码的值是脆弱的。为什么不使用../guide 是的,输出目录在阴影插件@A.DiMatteo 中 @Max 确实我确认,我能够重现您的行为,将用两个可行的解决方案写一个答案 我认为这里真正的问题是 Reactor 或“parent-pom”必须打包为 pom 而不是 jar。我希望能够构建项目并仅通过 1 个目录(“/guide/”)执行。 【参考方案1】:

Maven Shade Plugin 默认替换构建生成的原始 jar 并创建一个以 original 为前缀的副本。

可以通过outputDirectoryoutputFilefinalName配置条目来配置替换和重定位。

应用以下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase />
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>$project.artifactId-$project.version-something</finalName>
                        <outputDirectory>../guide</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我们是:

首先禁用默认jar的生成,根据您的要求和this dedicated SO Q/A指定 然后配置 Shade 插件以将其输出重新定位到上层 guide 文件夹(通过相对路径,@Tunaki 也建议使用更好的方法) 还配置finalName 元素以禁用替换(这也会影响重定位,因为(前缀)原始jar 也将被重定位)。根据official documentation,finalName 是

阴影 artifactId 的名称。如果您想更改本机工件的名称,您可以使用&lt;build&gt;&lt;finalName&gt; 设置。如果设置为不同于&lt;build&gt;&lt;finalName&gt; 的值,则不会执行文件替换,即使正在使用shadedArtifactAttached

因此,Maven 将仅在配置的位置生成阴影 jar。


另一种方法是使用outputFile 配置条目,它指定:

着色工件的输出文件的路径。设置此参数后,创建的存档既不会替换项目的主要工件,也不会附加。因此,此参数会导致参数finalName、shadedArtifactAttached、shadedClassifierNamecreateDependencyReducedPom 在使用时被忽略。

因此您可以将上面的配置更改为:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase />
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <outputFile>../guide/$project.artifactId-$project.version-shaded.jar</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

并且具有完全相同的行为。


旁注:您确实在此处更改了构建的行为。如果某人仅从模块文件夹本身构建单个模块,他/她将不会在 target 文件夹中找到预期的内容,而是在父文件夹中(有点意外)。


更新 应用上述配置并从命令行仅调用 Shade 插件

mvn shade:shade

但是,您将遇到以下问题:

[INFO] --- maven-shade-plugin:2.4.3:shade (default-cli) @ test-addjar ---
[ERROR] The project main artifact does not exist. This could have the following
[ERROR] reasons:
[ERROR] - You have invoked the goal directly from the command line. This is not
[ERROR]   supported. Please add the goal to the default lifecycle via an
[ERROR]   <execution> element in your POM and use "mvn package" to have it run.
[ERROR] - You have bound the goal to a lifecycle phase before "package". Please
[ERROR]   remove this binding from your POM such that the goal will be run in
[ERROR]   the proper phase.
[ERROR] - You removed the configuration of the maven-jar-plugin that produces the main artifact.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

【讨论】:

除了删除默认 jar 之外,两者都按预期工作。我收到一个错误:maven-shade-plugin:2.4.3:shade (default) @ projB --- [错误] 项目主工件不存在。这可能有以下 [ERROR] 原因: [错误] - 您已经直接从命令行调用了目标。这不受 [ERROR] 支持。请通过 POM 中的 [ERROR] 元素将目标添加到默认生命周期,并使用“mvn package”使其运行。 [错误] - 您已将目标绑定到“包”之前的生命周期阶段。请 [ERROR] 从您的 POM 中删除此绑定,以便目标将在 [ERROR] 正确的阶段运行。 [错误] - 您删除了生成主要工件的 maven-jar-plugin 的配置。 @Max 你是如何调用 Maven 的?一个简单的mvn clean package 就足够了。 是的 @Tunaki 我正在从指南目录调用干净的包 是的,我使用“mvn clean package”,不,它没有修复它,作为副产品没关系,原始 jar 文件不是什么大问题

以上是关于maven shaded jar:更改输出位置的主要内容,如果未能解决你的问题,请参考以下文章

maven 可执行jar maven-shade-plugin

maven 插件之间的区别 ( assembly-plugins , jar-plugins , shaded-plugins )

使用maven-shade-plugin打包maven项目,项目使用spring框架,打包成jar时报错,跪求大佬,弄了好久没出?

如何更改 Gradle 下载位置

maven-shade-plugin插件

maven插件: shade, assembly