在 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 PluginMaven 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 插件会是更好的选择。