Maven打包时包含依赖项:maven-shade-plugin与maven-assembly-plugin的使用

在Maven项目中,构建可执行的JAR或WAR文件时,有时需要将项目的所有依赖项打包在一起,以便在没有网络连接或特定依赖项管理策略的环境中运行。Maven提供了两种常用的插件来实现这一需求:maven-shade-plugin和maven-assembly-plugin。本文将详细介绍这两种插件的使用方法和适用场景。

1. 使用maven-shade-plugin打包依赖项

maven-shade-plugin是一个强大的Maven插件,它不仅可以将所有依赖项打包到一个JAR文件中,还可以对包进行重命名(以避免类名冲突)和修改Manifest文件等。

配置示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version> <!-- 请使用最新版本 -->
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.example.MainClass</mainClass> <!-- 指定主类 -->
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在上面的配置中,maven-shade-plugin会在package阶段执行,并生成一个包含所有依赖项的JAR文件。<mainClass>元素指定了应用程序的主类,这是运行JAR文件时所需的。

2. 使用maven-assembly-plugin打包依赖项

maven-assembly-plugin是另一个常用的Maven插件,它提供了更灵活的构建和打包选项。与maven-shade-plugin不同,maven-assembly-plugin不会修改依赖项的包名或内容,而是将它们作为资源文件添加到目标JAR或WAR文件中。

配置示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version> <!-- 请使用最新版本 -->
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <mainClass>com.example.MainClass</mainClass> <!-- 指定主类 -->
                            </manifest>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在上面的配置中,maven-assembly-plugin会在package阶段执行,并生成一个名为{artifactId}-jar-with-dependencies.jar的文件,该文件包含了项目的所有依赖项。<mainClass>元素同样指定了应用程序的主类。使用插件命令assembly:assembly进行打包。

3. 选择合适的插件
  • maven-shade-plugin:适用于需要修改依赖项包名或内容的场景,以及需要解决类名冲突的情况。
  • maven-assembly-plugin:适用于不需要修改依赖项内容,但需要将它们作为资源文件添加到目标JAR或WAR文件中的场景。
4. 总结

在Maven项目中打包依赖项时,maven-shade-plugin和maven-assembly-plugin都是强大的工具。选择哪个插件取决于你的具体需求和项目要求。通过合理配置这两个插件,你可以轻松地生成包含所有依赖项的可执行JAR或WAR文件,从而简化部署和运行过程。

希望这篇文章能帮助你更好地理解如何在Maven项目中打包依赖项。如果你有任何问题或建议,请随时在评论区留言。

更多推荐