【问题标题】:Renaming a fat jar with Maven用 Maven 重命名一个胖罐子
【发布时间】:2016-04-14 05:24:48
【问题描述】:

当我创建一个 jar 文件时,我想适应我的依赖项。为此,我使用maven-assembly-plugin,如下所示:

<build>
    ...
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <finalName>${project.artifactId}-GUI</finalName>
                <archive>
                    <manifest>
                        <mainClass>gui.MyMainClass</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- <appendAssemblyId>false</appendAssemblyId>-->
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
 </build>

此代码运行正常,并且可以按预期进行。但是,这会创建一个名为 myjar-GUI-jar-with-dependencies.jar 的新 jar。我想消除那个“jar-with-dependencies”结尾。有人知道怎么做吗?

我使用了您可以在我的代码中看到的注释行,但这会产生以下警告,我不知道如何解决它:

[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing.
Instead of attaching the assembly file: [myJar-GUI].jar, it will become the file for main project artifact.
NOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-deterministic!
[WARNING] Replacing pre-existing project main-artifact file: [myJar].jar with assembly file: [myJar-GUI].jar

已编辑

在用户 Tunaki 建议的解决方案之后,我使用了不同的插件,并且 maven 可以按照我的意愿工作。代码如下:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.2</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <transformers>
                    <transformer
                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>gui.SparkISGUI</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </plugin>

【问题讨论】:

    标签: java xml scala maven jar-with-dependencies


    【解决方案1】:

    首先,您需要了解收到此警告的原因。

    Maven 约定是一个项目应该创建一个单个主要工件。对于一个打包jar的项目,主要的工件是maven-jar-plugin的结果。此插件将仅将项目中包含的类打包为 JAR。

    一个项目最终可以生成额外的工件,这些工件将通过 classifier 与主要工件区分开来:

    除了主要工件之外,还有附加到 Maven 项目的附加文件。这样的附加文件可以被它们的分类器识别和访问。

    分类器是一个标识符,将附加到主要工件名称。

    那么当你想创建一个 uber-jar 时会发生什么?不知何故,您的项目需要生成 两个 jar。主要的将是一个包含项目类的 JAR,第二个将是由 maven-assembly-plugin 生成的 uber-jar。为了将这个次要附加工件与主要工件区分开来,添加了分类器jar-with-dependencies

    因此,当您删除分类器时,您实际上将主要工件替换为 uber-jar。 maven-assembly-plugin 在这种情况下会发出警告,这就是您遇到的警告。您可以完全忽略它:它只是提醒您正在将项目的主要工件替换为附加工件。


    除了maven-assembly-plugin,请注意您还可以使用maven-shade-plugin 生成一个超级jar:

    这个插件提供了将工件打包到 uber-jar 中的能力,包括它的依赖项和 shade - 即重命名 - 一些依赖项的包。

    【讨论】:

    • 谢谢你的回答,终于有人简单地解释了这个问题。我试着用maven-shade-plugin 做我正在寻找的东西,它奏效了。在这种情况下,它实际上似乎更容易使用。我将您的答案标记为正确,但是,我不能给您点意见,因为 StackOverflow 说我在这里没有声誉;)
    • @Rors 是的,maven-assembly-plugin 只支持基本的 uber-jar,maven-shade-plugin 是首选,因为它提供了更多控制权,而且我发现它更易于配置。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 2016-12-29
    • 2017-07-25
    • 2021-08-10
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多