Spring Boot 完全可执行的 jar,内部没有依赖项

Posted

技术标签:

【中文标题】Spring Boot 完全可执行的 jar,内部没有依赖项【英文标题】:SpringBoot fully executable jar without dependencies inside 【发布时间】:2017-11-26 05:10:35 【问题描述】:

注意:在将此问题标记为重复问题之前,请确保您知道 executable JARfully executable SpringBoot JAR 之间的区别。

The official Spring Boot documentation 描述了如何构建完全可执行的 JAR。然后生成的 JAR 文件可以从 /etc/init.d/ 链接,并作为普通的 unix 服务启动/停止/重新启动/状态使用,无需额外的脚本或 JSVC 等工具。

但是生成的 JAR 包含所有库,并且大小可以足够大(在我的情况下为 70Mb+)。

我想在没有库的情况下生成这种完全可执行的 JAR,然后能够在 Linux 上将其作为 SystemV 服务运行并以某种方式链接外部库 (JAR)。

更新

我想减小工件大小以加快部署->测试->修复周期。有时我通过移动网络工作,大文件会显着降低我的工作速度。

如果没有简单的配置属性或配置文件或命令行选项,我会使用一种 hack。

一开始,我可以生成一个包含所有依赖项的构建。 然后我可以解压缩并将所有库移动到一个特殊文件夹。

然后我需要以某种方式再次将其打包为完全可执行文件并指向包含库的文件夹来运行。

我认为 jar 实用程序无法做到这一点,因为 file 实用程序将完全可执行的 jar 识别为 data

$ file fully-executable.jar
file fully-executable: data

不像一般的罐子

$ file usual.jar
usual.jar: Java Jar file data (zip)

【问题讨论】:

为什么?然后你只需要在外部维护所有依赖项,这将需要另一个部署步骤,等等。 @Gregg 我已经更新了帖子。如果还不清楚,请告诉我。 你可以将它作为一个爆炸的jar来执行。因此,您可以创建 fat jar,解压缩,只部署您想要的工件,将其余部分“缓存”。有关类似问题,请参阅本文:bsideup.blogspot.com/2015/04/… @JarrodRoberson 这根本不是重复的。我知道如何创建一个简单的 JAR 可执行 JAR。但我问的是完全可执行的 JAR。我已经解释了它们之间的区别。 @JarrodRoberson 完全可执行的 jar 文件和可执行的 jar 文件之间存在差异。这两个术语都存在于 Spring Boot 的文档中。前者在文件中附加了一个 bash 脚本,可以使用./foo.jar 运行。后者不能也只能使用java -jar foo.jar 运行。我重新打开了这个问题,因为它不是重复的 【参考方案1】:

您可能需要考虑使用Spring Boot Thin Launcher。它使用您的应用程序代码创建一个 jar 文件,但没有任何依赖项。它添加了一个特殊的瘦启动器,该启动器知道如何在执行 jar 时从远程 Maven 存储库或本地缓存中解决应用程序的依赖关系。从你想要做的描述来看,你会使用本地缓存选项。

Spring Boot 的 Maven 插件配置以生成使用瘦启动器的完全可执行 jar,如下所示:

<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.3.RELEASE</version>
                </dependency>
            </dependencies>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

【讨论】:

你能告诉我 gradle 项目是什么吗? @Zenith for gradle 看这里:github.com/dsyer/spring-boot-thin-launcher 依赖项呢? 这将下载依赖项。 maven可以在另一个文件夹中添加依赖吗?

以上是关于Spring Boot 完全可执行的 jar,内部没有依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 运行完全可执行的 JAR 并指定 -D 属性

Spring Boot 可执行 jar “无效或损坏的 jar 文件”

Spring Boot:通过jar包启动

你的第一个Spring Boot应用

Spring Boot 上传 BootRepackage 可执行 Jar

聚合maven+spring-boot打包可执行jar