【问题标题】:Spring Layered Fat Jar and Gradle Plugin layertools jarmodeSpring Layered Fat Jar 和 Gradle 插件 layertools jarmode
【发布时间】:2020-06-09 17:13:23
【问题描述】:

Spring boot 2.3.0 具有分层的 fat jar,它们针对容器镜像构建进行了优化。现在,Spring 文档只讨论 Maven 构建工具,而不讨论 Gradle。

请问,我们需要对 Gradle 插件做些什么才能让它为 Spring Boot 构建一个“分层 jar”?

例如:如果使用 Gradle Spring 引导插件 id("org.springframework.boot") version "2.3.0.RELEASE" 创建的命令 java -Djarmode=layertools -jar app.jar extract 提取 jar,则会失败并显示消息:Unsupported jarmode 'layertools'。基本上,如果 jar 是使用 ./gradlew bootJar 构建的,那么分层 jar 默认情况下似乎是不活动的。

提取分层 jar 应该会产生以下目录,然后将这些目录复制到另一个容器映像中以执行,并且只有在较低层发生更改时,缓存系统才必须重新读取它们。使用-Djarmode=layertools 标志提取的分层 jar:

./dependencies/
./snapshot-dependencies/
./resources/
./application/

springSpring Blog 2.3.0.ML 的博客讨论了 Maven 构建工具和配置:

<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
    <layout>LAYERED_JAR</layout>
</configuration>

我们如何为 Gradle 插件启用相同的配置?

【问题讨论】:

  • java -Djarmode=layertools -jar build/libs/*.jar list检查Gradle分层JAR的内容...因为使用Gradle我得到一个spring-boot-loader文件夹...这似乎不是maven的情况...同样Gradle 插件的分层 Jar 中不存在 resources 文件夹。

标签: java spring spring-boot gradle jar


【解决方案1】:

该文档提供了如何使用 spring-boot-gradle-plugin 为 spring boot 应用程序激活分层 fat jar。

详情请见Packaging Layered Jars with Gradle

build.gradle 文件中:

// Groovy solution
bootJar {
    layered()
}


// Kotlin solution
tasks.getByName<BootJar>("bootJar") {
    layered()
}

希望这会有所帮助。

【讨论】:

  • Kotlin 版本稍微简洁一点的版本是tasks.bootJar{layered()}
  • 这是您编写 groovy 插件时需要的:project.tasks.withType(BootJar).first().layered.includeLayerTools = true
【解决方案2】:

您还可以在此处找到更多信息:

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/gradle-plugin/reference/html/#packaging-layered-jars

bootJar {
  layered {
    enabled = true

    application {
      intoLayer("spring-boot-loader") {
        include "org/springframework/boot/loader/**"
      }
      intoLayer("application")
    }
    
    dependencies {
      intoLayer("snapshot-dependencies") {
        include "*:*:*SNAPSHOT"
      }
      intoLayer("dependencies")
    }

    layerOrder = ["dependencies", "spring-boot-loader", "snapshot-dependencies", "application"]
  }
}

您将在 JAR 中的 layers.idx 文件中找到相应的层名称。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2016-02-08
    • 2020-01-06
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2014-08-30
    • 2020-09-04
    • 2016-12-24
    相关资源
    最近更新 更多