在 Maven 项目中,如果你想将本地的依赖库(例如没有在中央仓库或者私有仓库中提供的 JAR 文件)打包到最终的 JAR 文件中,可以使用 Maven Assembly Plugin 或 Maven Shade Plugin 来实现。以下是这两种方法的详细步骤。
1. 使用 Maven Assembly Plugin
Maven Assembly Plugin
允许你将所有的依赖项(包括本地的 JAR)打包到一个单独的 JAR 文件中。
步骤 1:配置 Assembly 插件
在你的 pom.xml
文件中,添加以下配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase> <!-- 打包阶段 -->
<goals>
<goal>single</goal> <!-- 打包成单个 JAR 文件 -->
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <!-- 打包带依赖的 JAR -->
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
步骤 2:安装本地 JAR 到本地 Maven 仓库
如果你的本地 JAR 文件没有上传到任何仓库,你可以使用 mvn install:install-file
命令将其安装到本地 Maven 仓库。
例如,假设你有一个 my-library-1.0.jar
文件,你可以运行以下命令:
mvn install:install-file -Dfile=/path/to/my-library-1.0.jar -DgroupId=com.example -DartifactId=my-library -Dversion=1.0 -Dpackaging=jar
步骤 3:构建并生成带有所有依赖项的 JAR 文件
现在你可以运行以下 Maven 命令来打包你的项目,并将所有依赖项(包括本地依赖)打包到最终的 JAR 文件中:
mvn clean package
运行后,target
目录下会生成一个类似 my-project-1.0-jar-with-dependencies.jar
的文件,里面包含了所有的依赖项,包括本地的 JAR 文件。
2. 使用 Maven Shade Plugin
Maven Shade Plugin
是另一个非常流行的插件,用于创建一个包含所有依赖的“uber JAR”。它支持将所有的依赖项打包到一个 JAR 中,同时能够避免类冲突。
步骤 1:配置 Shade 插件
在 pom.xml
中添加 Maven Shade Plugin
配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase> <!-- 打包阶段 -->
<goals>
<goal>shade</goal> <!-- 生成 Uber JAR -->
</goals>
<configuration>
<transformers>
<!-- 保证 main 类在生成的 JAR 文件中 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass> <!-- 替换为你的主类 -->
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
步骤 2:安装本地 JAR 到本地 Maven 仓库
和上面的 Assembly 插件一样,你也需要安装本地 JAR 文件到本地仓库:
mvn install:install-file -Dfile=/path/to/my-library-1.0.jar -DgroupId=com.example -DartifactId=my-library -Dversion=1.0 -Dpackaging=jar
步骤 3:构建并生成带有所有依赖项的 JAR 文件
运行以下命令来构建项目并将所有的依赖项打包到一个 JAR 文件中:
mvn clean package
运行后,target
目录下会生成一个类似 my-project-1.0-shaded.jar
的文件,其中包含了所有的依赖项,包括本地依赖的 JAR 文件。
3. 比较 Assembly Plugin 与 Shade Plugin
特性 | Maven Assembly Plugin | Maven Shade Plugin |
---|---|---|
功能 | 打包所有依赖到一个 JAR 文件中 | 创建一个 Uber JAR,包含所有依赖,避免类冲突 |
依赖冲突处理 | 不处理类冲突 | 能够自动处理类冲突(可配置) |
生成的 JAR 文件 | -jar-with-dependencies 后缀 | -shaded 后缀 |
使用场景 | 简单的 JAR 打包,适合不复杂的项目 | 需要创建 Uber JAR,避免类冲突,适合复杂项目 |
4. 总结
- Maven Assembly Plugin:适用于简单地将所有的依赖库打包成一个 JAR 文件。它的配置简单,适合一些基本需求。
- Maven Shade Plugin:适用于更复杂的情况,尤其是需要避免类冲突的场景。它能够生成一个包含所有依赖的 “uber JAR”,并且可以自定义如何处理类冲突。
选择合适的插件,基于你的项目需求进行打包。如果只是简单的依赖打包,Assembly 插件足够。如果你有更多的定制需求,或者要处理类冲突,Shade 插件会是更好的选择。
发表回复