FatJar包初体验
背景
将Java项目制作成一个可分发的包,有四种方式。但是最方便的还是制作成FarJar包,即一个统一的Jar包。
四种打包方式
Unshaded包
解压所有 jar 文件,再重新打包成一个新的单独的 jar 文件。
存在的问题是:如果多个jar包中有同名类文件,最终的jar文件中只会保持一个类文件,所以可能导致不可用。
Shaded包
解压所有 jar 文件,修改类路径到指定路径下,再重新打包成一个新的单独的 jar 文件。
存在的问题是:代码中使用 Class.forName 或 ClassLoader.loadClass 装载的类会不可用。
将依赖打包到单独的目录中
将依赖的jar包,放到单独的目录中。
存在的问题是:最终结果是一个压缩包,使用时需要解压。
嵌套方法
将依赖的jar包,原原本本的打包到最终的FarJar包中。这样避免了上面的三个方式。
FarJar的打包方式
onejar-maven-plugin是比较老的一个插件,打包运行里,会出现一堆的warning情况。
spring-boot-maven-plugin是Spring Boot 提供的 Maven Plugin,目前推荐使用。
初体验
pom依赖
<build>
<finalName>abeffect-client</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.abeffect.MainClient</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包
mvn clean package spring-boot:repackage
运行
java -jar abeffect-client.jar
入口是 com.abeffect.MainClient
文件。
shade打包方式
写入MainClass
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.lcifn.Application</mainClass>
</transformer>
</transformers>
</configuration>
合并同一接口的多个实现
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>