java - SpringBoot完全可执行的jar,内部没有依赖

标签 java maven spring-boot executable-jar spring-boot-maven-plugin

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

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

但生成的 JAR 包含所有库,并且大小足够大(在我的例子中为 70Mb+)。

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

更新

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

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

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

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

我不认为这可以通过 jar 实用程序来完成,因为 file 实用程序将完全可执行的 jar 识别为 data

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

不像通常的 jar

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

最佳答案

您可能需要考虑使用 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>

关于java - SpringBoot完全可执行的jar,内部没有依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707574/

相关文章:

java - 什么是NullPointerException,我该如何解决?

Java 对象不是声明类的实例

java - 将 Jersey 从 1.x 迁移到 2.x 时出现编译错误

maven - 如何禁用使用 Eclipse Jetty Maven 插件运行的 Jetty 的 jsessionid?

java - Gradle 依赖项解决配置文件问题

spring - 未抛出 spring webflux 的自定义异常

Java Function and then 签名解释

Java 成对反转链表

java - JHipster - 生成假数据

java - 反射(reflect) Spring 应用程序在运行时配置中所做的更改,而无需重建它