Maven 配置文件 POM 的常用插件配置代码

【说明】

普通

运行环境

  • JDK 17

  • Maven 3.6.3

  • IntelliJ IDEA 2021.2.2 (Ultimate Edition)

将 Maven 多模块依赖集成打进一个 JAR 包(方法 1)

  此插件可以用于在 Maven 当前模块中生成本模块的 JAR 包,其中,此 JAR 包含了本模块直接或间接依赖的所有 JAR 包,及它们直接或间接依赖的所有资源文件。如果不在父 POM 使用该插件,则需要提前将此模块依赖的其它模块手动安装至 Maven 仓库中,所以建议在父 POM 中使用该插件。

  如果遇到 Maven 多模块中各自的模块有同名同路径的资源文件这种情况,此时打包时只会保留其中的一个。更详细的信息,可见笔者的另一篇博客:

  将 Maven 中的多模块项目只打成一个 JAR 包:
https://blog.csdn.net/wangpaiblog/article/details/119628194?spm=1001.2014.3001.5501

  使用该插件的命令为:mvn package assembly:single

<project xmlns=...>
    
    <build>
        <plugins>
            
            <!-- 此插件必须放在父 POM 中  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <!--
                    执行本插件的方法为,在主目录下执行如下命令:
                    mvn package assembly:single

                    对于 IntelliJ IDEA,生成的 JAR 包位于每个模块下的文件夹 target
                    -->
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <!-- 此处 IntelliJ IDEA 可能会报红,这是正常现象  -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifest>
                            <!-- 配置程序运行入口所在的类 -->
                            <mainClass>包名.类名</mainClass>
                        </manifest>
                    </archive>
                    <!-- 设置 JAR 包输出目录 -->
                    <outputDirectory>${project.build.directory}/#maven-assembly-plugin</outputDirectory>
                    <!-- 设置打包后的 JAR 包的目录结构为默认 -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>

将 Maven 多模块依赖集成打进一个 JAR 包(方法 2)

  此插件可以用于在 Maven 当前模块中生成本模块的 JAR 包,其中,此 JAR 包含了本模块直接或间接依赖的所有 JAR 包,及它们直接或间接依赖的所有资源文件。如果不在父 POM 使用该插件,则需要提前将此模块依赖的其它模块手动安装至 Maven 仓库中,所以建议在父 POM 中使用该插件。

  如果遇到 Maven 多模块中各自的模块有同名同路径的资源文件这种情况,此时打包时只会保留其中的一个。更详细的信息,可见笔者的另一篇博客:

  将 Maven 中的多模块项目只打成一个 JAR 包:
https://blog.csdn.net/wangpaiblog/article/details/119628194?spm=1001.2014.3001.5501

  使用该插件的命令为:mvn package

<project xmlns=...>
    
    <build>
        <plugins>
            
            <!-- 此插件必须放在父 POM 中  -->
            <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>
                            <!--
                            设置将依赖整合到一个自定义名称的 JAR 包。
                            如果不设置此项,依赖将整合到 Maven 无插件时的默认 JAR 包,并生成一个前缀为 original- 的无依赖 JAR 包
                             -->
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <!-- 设置生成的 JAR 包后缀名 -->
                            <shadedClassifierName>shaded-with-dependencies</shadedClassifierName>
                            <!-- 设置程序运行入口 -->
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>包名.类名</mainClass>
                                </transformer>
                            </transformers>
                            <!-- 设置 JAR 包输出目录 -->
                            <outputDirectory>${project.build.directory}/#maven-shade-plugin</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>

生成单入口类 JAR 包

  此插件可以用于在 Maven 当前模块中生成单入口类 JAR 包。利用此插件生成的 JAR 包,只包含当前模块的文件(包含本模块下的资源文件),虽然不包含任何依赖,但其中设置了程序运行入口类、依赖 JAR 包的相对路径。可以通过将依赖 JAR 包放入指定目录,然后仅通过本 JAR 包(无需在命令行中指定依赖包路径)来运行 Java 应用。因此,本插件一般在程序入口模块使用。本插件往往与插件 maven-dependency-plugin 一起配合使用。

<project xmlns=...>
    
    <build>
        <plugins>
            
            <!--
            此插件可以用于在当前模块中生成单入口类 JAR 包。
            此插件往往与插件 maven-dependency-plugin 一起配合使用
            -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <!-- 配置程序运行入口所在的类 -->
                            <mainClass>包名.类名</mainClass>
                            <!--
                            设置程序的 ClassPath 路径。
                            这指的是在命令行中 java -cp XXX 中 -cp 参数的内容。也就是说,此项为依赖 JAR 包目录。
                            如果设置了此项,且之后把依赖 JAR 包全部放入目录 lib/ 下,
                            然后就可以直接使用 java -jar XXX.jar 来运行本 JAR 包,而无需在命令中指定依赖
                            -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <addClasspath>true</addClasspath>
                        </manifest>
                    </archive>
                    <!-- 设置 JAR 包输出目录 -->
                    <outputDirectory>${project.build.directory}/#maven-jar-plugin</outputDirectory>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>

生成完整依赖单 JAR 包

  此插件可以用于在 Maven 当前模块中生成完整的依赖单 JAR 包。完整指的是对于本模块直接或间接依赖的 JAR 包都会生成,且这些 JAR 包还各自包含了它们所属模块的资源文件。单 JAR 包指的是生成各依赖包之间互相没有交集(没有重复依赖)。但不生成本模块自身的 JAR 包,所以在此插件的设置中无需设置程序运行入口类。本插件往往与插件 maven-jar-plugin 一起配合使用。

<project xmlns=...>
    
    <build>
        <plugins>
            
            <!--
            此插件是用于生成该模块所直接和间接引用的所有依赖。
            但生成的不包括自身的 JAR 包,所以在此插件的设置中无需设置程序运行入口类。
            此插件可在生命周期 package 中被执行。
            此插件往往与插件 maven-jar-plugin 一起使用
            -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- 设置 JAR 包输出目录 -->
                            <outputDirectory>${project.build.directory}/#maven-jar-plugin/lib</outputDirectory>
                            <overWriteReleases>true</overWriteReleases>
                            <overWriteSnapshots>true</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>compile</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>

导出资源文件

  此插件可以用于在 Maven 当前模块中导出本模块所需的资源文件。但生成的资源文件只包含本模块的资源文件,不包括其依赖的其它模块的资源文件,因此作用有限。此插件往往与插件 maven-jar-pluginmaven-dependency-plugin 一起使用。此插件建议放在父 POM 中使用。

<project xmlns=...>

    <build>
        <plugins>

            <!--
            此插件是用于拷贝该模块的资源文件指指定目录。
            但生成的资源文件只包含本模块的资源文件,不包括其依赖的其它模块的资源文件
            此插件可在生命周期 package 中被执行。
            此插件往往与插件 maven-jar-plugin、maven-dependency-plugin 一起使用

            此插件建议放在父 POM 中
            -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <!-- 设置此插件执行的阶段,可更改为其它阶段 -->
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <!-- 设置资源文件输出目录 -->
                            <outputDirectory>${project.build.directory}/#maven-resources-plugin</outputDirectory>
                            <resources>
                                <resource>
                                    <!-- 设置原资源文件所在目录 -->
                                    <directory>src/main/resources</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>

Spring Boot

制作 JAR 包

  对于 Spring Boot 项目,使用常规的生成 JAR 包的插件会引发很多问题,因此,对于它们应该使用如下插件。

<project xmlns=...>
   
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

【注意事项】

  • 使用此插件的 Maven 模块,必须直接或间接继承至 Spring Boot 模块。也就是说,此模块或其直接或间接父模块需要添加如下继承代码。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>Spring Boot 的版本</version>
    </parent>
    
    • 如果不这么做,使用本插件打包成 JAR 后运行时会有遇到各种问题,如本插件失效,从而打包时不包含依赖等等。
    • 如果不这么做,而选择普通方法(将 Spring Boot 视为常规依赖项,然后使用其它插件进行打包),打包成 JAR 后运行时会有遇到各种问题,如运行时提示缺失 Spring Boot 的一些配置文件等等。
  • 本项目的入口类被 Spring Boot 认为是拥有注解 @SpringBootApplication 的类。

  • 只有有 Spring Boot 入口类的模块才能运行本插件。另外,如果使用本插件的模块有多于一个的 Spring Boot 入口类,打包时会报错。

  • 当使用了此插件制作 JAR 包后,程序的启动类会变成 org.springframework.boot.loader.JarLauncher


JavaFX

运行环境:

  • JDK 17

  • JavaFX 17-ea+11

  • Maven 3.6.3

  • IntelliJ IDEA 2020.2.2 (Ultimate Edition)

添加在命令行运行 JavaFX 应用的功能

<project xmlns=...>
   
    <build>
        <plugins>
            <!-- 在本目录下,使用命令 mvn javafx:run 来运行此插件 -->
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.6</version>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>包名.类名</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值