SpringBoot工程将lib打包到外部的maven配置

一、配置layout为zip

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<!-- 排除所有Jar -->
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
<excludes>
</excludes>
</configuration>
</plugin>

不配置这一项,maven将把整个应用打包成spring boot的可执行包带所有的library,用自己的ClassLaoder,体积巨大无比,唯一的优势是无需关注依赖。

对于开发阶段需要频繁更新的应用来说,每次部署需要上传的文件太大了。

二、配置将所需的lib输出到指定目录

只配置上面的插件,将只输出一个不包含Lib的jar包,而没有依赖文件,因此还应当添加如下插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>

这一插件将所有的依赖打包到输出目录下的lib子目录当中,发布时只需要发布一次这个目录,后面就可以只更新主jar包了(依赖有变化时当然也需要同步的更新此目录)。

三、配置spring-boot的启动类

配置完上面的之后打包出来的虽然也是spring-boot的包,但不是可执行包,它的ClassLoader不对,不可直接通过java -jar执行,此时再添加一个插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>xxxx.yyyy.zzzz.SpringBootApplicationClass</mainClass>
<!--取消jar包版本号-->
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>

注意其中的mainClass应当指向SpringBootApplication类完整路径,通过这个插件编译后的最大(本质上的唯一)区别是META-INF/MENIFEST.MF文件中的内容区别,具体内容就不说了。

 

 

 

 

 

Continue Reading