6

当我创建一个 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-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>
4

1 回答 1

11

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

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

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

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

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

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

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


除了maven-assembly-plugin,请注意,您还可以使用 生成 uber-jar maven-shade-plugin

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

于 2016-01-09T16:02:03.990 回答