这是一篇旧帖子,但我认为这两个答案都不准确,也不是 100% 正确。
事实上,超级 JAR 必须包含所有运行时和提供的依赖项。但第一个问题从这里开始。
通常,依赖项包含它们自己的 MANIFEST.MF 文件,如果您使用上面的示例将它们组装到 JAR 中,那么您将在 Maven 构建期间得到一个 WARNING 说明您覆盖它们的事实,因为 JAR 只能有一个清单文件。这是不好的。所以请不要把依赖放在同一个目录下。
第二个问题与以下两个警告有关:
[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing. Instead of attaching the assembly file: [...]/target/....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: [...]/target/....jar with assembly file: [...]/target/....jar
你得到这个的原因是因为你用程序集插件构建了一个新的 JAR,但你的组装 JAR 的分类器没有指定。
默认情况下,非 pom 类型的 Maven 项目会作为主要工件生成。该工件是 maven 打包(JAR、WAR 或 EAR)的结果。此工件附加到您的项目并由 Maven 在使用mvn install、mvn deploy 安装、部署或发布您的项目时使用。当然,你可以在目标文件夹下生成不同的文件,但你的主神器还是一样的。
您使用程序集插件构建的 JAR 与您的默认工件冲突。所以我强烈建议你不要使用这个:
<appendAssemblyId>false</appendAssemblyId>
程序集 ID 是您的 uber JAR 的分类,因此请将上面的属性设置为 TRUE 或完全忽略它,因为它的默认值为 TRUE。
工件的默认命名约定如下:artifactId-version(-classifier).type
您可以在下面找到一个完整的示例。
pom.xml:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven.assembly.plugin.version}</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}-aa-${project.version}</finalName>
<descriptors>
<descriptor>${basedir}/src/main/resources/assembly.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>x.y.z.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Assembly 插件配置:
<assembly>
<id>with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>provided</scope>
</dependencySet>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
组装后的 JAR 是这样命名的:<project-name>-1.0-with-dependencies.jar
希望它能帮助您构建完美的 uber JAR。