用Maven重命名一个胖罐子

时间:2016-01-09 15:45:45

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

当我创建一个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。我想消除那些&#34; jar-with-dependencies&#34;结尾。有谁知道怎么做?

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

[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

EDITED

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

1 个答案:

答案 0 :(得分:9)

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

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

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

  

除了主要工件之外,还可以添加附加到Maven项目的其他文件。这种附加的字段可以被其分类器识别和访问。

分类器是将附加到主工件名称的标识符。

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

因此,当您删除分类器时,您可以使用uber-jar有效地替换主工件。在这种情况下,maven-assembly-plugin会发出警告,这就是您所遇到的警告。你可以完全忽略它:它只是提醒你,你正在用一个额外的工件替换项目的主要工件。

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

  

这个插件提供了将工件打包在超级jar中的功能,包括它的依赖关系和 shade - 即重命名 - 一些依赖项的包。