参考

本文主要参考: 廖雪峰-瘦身Spring Boot应用 Spring Boot Thin Launcher GitHub 官方站点

改进打包配置

针对原文 瘦身Spring Boot应用 中已不适用新版 1.0.31的内容进行调整。 首先需要在打包插件中添加repackageexecution,其目的是将spring-boot-thin-layout 插件的 ThinJarLauncher 类打包到你的 jar 文件中。 不加上的话,会报找不到这个类的异常。修改后 pom.xml 的 build 节点如下所示:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.boot.experimental</groupId>
                        <artifactId>spring-boot-thin-layout</artifactId>
                        <version>1.0.31.RELEASE</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
                <!-- Thin 方式构建的 jar 文件需要重新打包,将 ThinJarLauncher 的插件 class 打包到生成的 jar 文件内,否则会出现找不到该 class 的异常 -->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

改进下载 repo

运行java -jar my-app.jar的时候会出现卡住的情况,其原因是首次启动时会自动联网下载相关依赖 jar 。如果本机未进行任何 maven 配置的话,则默认是从国外的 maven 仓库https://repo.spring.io/snapshot去下载,会非常的慢甚至会无法访问。因此需要在 pom.xml 配置国内的镜像仓库,加快下载速度。如果你需要本地预热方式下载或者你的应用需要给不同国家用户使用的话,则不要在 pom.xml 里面指定,应该用命令行方式指定。

pom.xml 增加 repositories 的配置,使用 aliyun 的仓库,如下:

    <repositories>
        <repository>
            <id>maven</id>
            <name>aliyun maven</name>
            <!--            <url>https://repo.maven.apache.org/maven2</url>-->
            <url>https://maven.aliyun.com/repository/central</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

国内常见的仓库镜像:

<mirrors>
    <mirror>
        <id>huaweicloud</id>
        <mirrorOf>central</mirrorOf>
        <url>https://repo.huaweicloud.com/repository/maven/</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    <mirror>
        <id>nexus-163</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus 163</name>
        <url>http://mirrors.163.com/maven/repository/maven-public/</url>
    </mirror>
    <mirror>
        <id>nexus-tencentyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus tencentyun</name>
        <url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
    </mirror>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>

运行

对于首次运行的时候,建议使用如下命令方式,此时会在运行过程输出下载依赖 jar 文件的日志,可以观察 jar 运行是否正常:

输出调试信息

java -Dthin.debug=true -jar my-app.jar

如果你想输出更为详细的调试信息,可以继续增加 thin.trace 这个控制项:

java -Dthin.debug=true -Dthin.trace=true -jar my-app.jar

预热下载依赖

若只是想下载依赖项,而不是运行程序,可以用如下命令:

java -Dthin.debug=true -Dthin.dryrun=true -jar my-app.jar

这个预热下载依赖功能对于制作 docker 镜像而言非常有用。你可以预先将所有的依赖项下载后添加到 Dockerfile 做为镜像的第 1 个层,之后再添加你的应用程序部分作为第 2 个层,那么后续更新应用的时候,只要你的依赖的 jar 库不发生变化,那么 docker 传输的内容将非常的少,不用再为缓慢的上传速度而烦恼了。

无网络环境

对于服务器端或 docker 容器禁止访问外网的,可以在本地预热下载依赖,然后生产环境使用offline模式,此时要求所有依赖项在本地仓库中必须存在,否则会因为缺少依赖项而无法运行:

java -Dthin.debug=true -Dthin.offline=true -jar my-app.jar

指定本地仓库

你可以指定本地仓库的路径,若不存在则创建,已存在则使用该路径。所有依赖项将下载到该路径,其存储方式与标准 maven 依赖存储一致。

java -Dthin.root=. -Dthin.offline=true -jar my-app.jar

指定网络仓库地址

ThinJarLauncher默认的仓库地址是https://repo.spring.io/snapshot,你可以通过命令行的thin.repo参数改变它,使用国内的仓库。比如我们可以换成 aliyun 仓库,使用如下命令:

java -Dthin.repo=https://maven.aliyun.com/repository/central -Dthin.dryrun=true -jar my-app.jar