可执行 jar 打包方式

一般而言 maven 打出的 jar 只包含工程代码,不包含依赖的第三方 jar。这类 jar 无法直接使用。

为了简化部署,期望一个项目可以直接通过 java -jar 的方式启动。这种 jar 包,被称为可执行 jar。

可执行 jar 打包方法

fat-jar(uber-jar)

fat-jar 是将工程代码、第三方代码全都展开打到一个 jar 包中。只包含 class 文件。

可以通过 maven-shade-plugin plugin 实现

参考配置:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <configuration>
                    <transformers>
                        <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>com.xxx.xxx.xxx</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

jar in jar

jar in jar 是将工程代码、第三方代码以 jar 的形式打到一个 jar 包中,包含了工程的 class,和第三方的 jar 包。这种打包方法需要重新实现 classloader。

可以通过 spring-boot-maven-plugin plugin 实现

该插件已经实现了 classloader, 并且会自动寻找到启动类。个人比较喜欢 spring-boot-maven-plugin ,因为工程代码和第三方类库是区分开的。

参考配置:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.2.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

补充网友的原理分析:spring-boot-maven-plugin 原理分析