maven的打包插件如何使用

Maven项目中的插件使用:依赖打包与Java/Scala混合编译

默认的情况下,当直接执行maven项目的编译命令时,对于结果来说是不打第三方包的,只有一个单独的代码jar,想要打一个包含其他资源的完整包就需要用到maven编译插件,使用时分以下几种情况。

需要明白,下面罗列的这几种是一般情况下够用了,但确实会有一些比较刁钻的少数情况,就需要灵活使用,如果大家在使用过程中遇到这方面的情况,欢迎私信我交流一下

第一种:当只是想单纯的开发一个maven项目,不涉及其他复杂的项目结构,最后只需要一个全部资源可执行jar,就用如下插件pom

<build>
        <plugins>
            <!-- Maven Assembly Plugin 是maven官方的编译打包插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <!-- 插件的配置参数相关-->
                <configuration>
                    <!-- 当你在打可执行包,也就是结果包是一个jar时,可以指定主类,不需要主类时无需写archive-->
                    <archive>
                        <manifest>
                            <mainClass>com.yourpackage.MainClass</mainClass>
                        </manifest>
                    </archive>
                    <!-- 这里需要给一个结果包的后缀,用来区分-->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <!-- 插件的执行阶段定义,可以有多个,不过一般一个打包的就够了 -->
                <executions>
                    <execution>
                        <!-- 这个id是自定的,保证有多个执行阶段的时候是唯一的就行 -->
                        <id>make-assembly</id>
                        <!-- 这个执行阶段在maven的那个阶段生效,这里绑定在打包时生效 -->
                        <phase>package</phase>
                        <!-- 这个single是固定的不用变,意思是根据给定的或者默认的配置来执行编译,默认时是打当前项目的所有dependencies为一个完整包,这个参数不要过多纠结官方文档中也只有这个,你要能力够可以自己封装 -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
</build>

打包后项目的输出路径下,除了原本的最小jar外,会有一个包名包含jar-with-dependencies的jar
在这里插入图片描述
第二种:assembly是一个比较好用的编译插件,无论是单独打jar,还是整个项目打归档类的包,都能胜任,不过早些年ssm那个时代,Java常用的编译插件是compiler,这个插件现在也有人用,不过它在打包的时候常常出问题,所以用它来打jar包的话,保险起见要指定resources。同时它只能用来编译,打jar包是配合另外一个插件。在ssm这种web开发使用到的比较多,而 Spring boot之后官方提供了自己的编译插件,再加上它没有assembly那么好用,所以现在用的不多

<build>
        <plugins>
            <!-- maven在进行一些编译操作所使用的默认插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- maven默认的打包插件 -->
            <plugin>
			      <groupId>org.apache.maven.plugins</groupId>
			      <artifactId>maven-jar-plugin</artifactId>
			      <version>3.3.0</version>
			      <configuration>
			        <archive>
			          <manifest>
			            <!-- 指定主类,如果你只是一个资源类的项目,不需要主类,就无需写archive标签 -->
			            <mainClass>com.example.MainApplication</mainClass>
			          </manifest>
			        </archive>
			      </configuration>
            </plugin>
        </plugins>

        <!-- resources默认指向java和resources目录,但是早期的SSM它的mapper文件可以写在java源代码路径下,因此需要重写resources标签 -->
		<resources>
            <resource>
                <directory>src/main/java</directory><!--所在的目录-->
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>src/main/resources</directory><!--所在的目录-->
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes
Maven 项目中,打包操作通常依赖于同的插件来完成特定的需求。根据常见的使用场景,以下是一些推荐的 Maven 打包插件及其配置方法。 ### maven-jar-plugin 这是 Maven 默认使用插件,用于将项目编译为 JAR 文件。如果项目中包含可执行类(带有 `main` 方法),可以通过配置指定主类。 ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> </plugin> ``` ### maven-assembly-plugin 此插件用于将项目及其所有依赖项打包到一个单独的输出文件中,适用于构建独立运行的应用程序[^2]。 ```xml <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> ``` ### maven-shade-plugin 该插件提供了更高级的功能,例如重写 JAR 包中的依赖关系,并支持创建可执行的 uber-jar。适用于需要解决依赖冲突或复杂合并逻辑的项目。 ```xml <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> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> ``` ### spring-boot-maven-plugin 对于 Spring Boot 项目,官方推荐使用插件打包。它能够创建自包含的可执行 JAR 或 WAR 文件,同时简化了部署流程。 ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> ``` ### mainclass-finder-maven-plugin 这是一个自定义插件,用于自动识别并设置项目的主类。通过修改 `maven-jar-plugin` 的配置来实现动态注入主类信息。 ```java // 设置全局属性 project.getProperties().setProperty("mainClassFoundByFinderPlugin", "com.example.Main"); ``` ### 其他常用插件 除了上述插件外,还有一些其他插件也常用于 Maven 项目的打包工作,如 `maven-war-plugin` 用于 Web 应用的 WAR 包构建,以及 `maven-ejb-plugin` 用于 EJB 模块的打包等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值