FatJar包初体验

  |   0 评论   |   0 浏览

背景

将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>

参考