基本概念
首先需要明白,我们自己下载的maven亦或是idea自带的maven,本身都具备了clean、compiler、package、install、deploy的能力。所以,即使我们的项目中pom没有引入相关的编译打包jar包,也能完成这些操作。但是,要注意,这个时候打包的项目jar包,是不包含第三方jar包的,仅仅是我们项目的class文件而已。有了这个概念,就可以开始我们的编译配置了。
配置方法
第一种方式
如果希望我们的项目是按照springboot的项目架构,把我们的项目代码和第三方开源jar包打包到jar包中,那么需要引入springboot-maven-plugins的jar包(绝大部分springboot项目中都配置)。这意味着,有这个插件生成的jar包,里面包含了我们引入的所有第三方jar包,能够直接放到服务器上用java -jar的方式执行。
pom配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.4.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
生成的jar是我们熟悉的目录。
第二种方式
引入maven-assembly-plugin插件,这种方式在项目中一般作为辅助手段引入。它可以将我们需要的额外的清单文件、项目、第三方开源jar压缩到一个压缩包中,交付到相应的人员手中,而不需要零散地一个个去发送。这种方式可以与springboot-maven-plugins共存,只要不配置相应的assembly descriptor,就不会生成带有第三方开源jar的jar包。
pom配置:
可以看到,仅仅是多了一个压缩文件。
那么,如果需要生成这样的jar包呢?在不想使用springboot-maven-plugins的情况下,定制自己的打包规则,可以这样做。
pom配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<-- 这里是关键,决定了打包的目录结构 -->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
可以看到,还多了一个我们的assemly.xml中指定的文件名的jar包,这个jar包包含了所有的第三方开源jar,拿到服务器也能正常执行。但是目录结构和我们认识的不太相同,不方便管理和查看,见以下:
实际上,这个结构和assembly descriptor有关,maven-assembly-plugin内置了几个可用的assembly descriptor:
- bin : 类似于默认打包,会将bin目录下的文件打到包中
- jar-with-dependencies : 会将所有依赖都解压打包到生成物中
- src :只将源码目录下的文件打包
- project : 将整个project资源打包
具体的定义,可以到maven-assembly-plugin-2.4.jar里查看。
总结
一般来说,都是引springboot-maven-plugins,当需要定制化jar包内容的时候,选用maven-assembly-plugin。当然,最重要的根据项目的需要,灵活选择。
完~