java - 即使在 gradle 构建中排除后,Spring Boot DevTools 仍在 docker 容器内使用

标签 java spring spring-boot jib

因此,我们使用 Spring boot 来交付我们的应用程序。我们使用 Jib 插件来监控创建 docker 镜像并运行它们。 我们使用 gradle 来构建项目,并且开发工具被识别为 developmentOnly 依赖项。 正如 spring 文档中提到的 https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-devtools .

但是,当它在 prod 的容器中运行时,我仍然看到它时不时地重新启动。 我的问题是 gradle 配置是否并没有真正将其从包装中排除。 我是否需要显式设置 -Dspring.devtools.restart.enabled=false 参数?

解决方案:

原来是gradle jib插件在玩游戏。 虽然 spring 文档详细介绍了如何从 gradle spring boot 项目中删除依赖项。指定 developmentOnly 的技术仅有助于告诉 gradle 忽略开发工具。 jib gradle 插件有自己的想法。

它包含构建 docker 镜像时的所有 jar,并且无法排除任何 jar。唯一合理的办法就是在build.gradle中自定义gradle jib插件来写这个,

 jib {
    from {
        image 'gcr.io/distroless/java:11'
    }
    container {
        jvmFlags = ['-Xms1G', '-Xmx1G', '-Dspring.devtools.restart.enabled = false']
    }
}

这将确保即使包含 jar,容器环境也会重新启动。

引用:https://github.com/spring-projects/spring-boot/issues/15382

最佳答案

这里确实存在一些问题:

  1. Springboot 有自己的自定义定义,而不是使用与配置文件等效的内容。他们的方法最适合 springboot 用户,但很难与他们所有的自定义逻辑集成。
  2. Jib 无法知道每个框架的所有自定义实现。

我真的认为你应该做的是这样的:

dependencies {
  if (System.getProperty("development") == true) {
    // include the springboot devtool dependency
  }
}

当你想在开发模式下运行或构建时,只需执行

./gradlew whateverTask -Ddevelopment=true

关于java - 即使在 gradle 构建中排除后,Spring Boot DevTools 仍在 docker 容器内使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074597/

相关文章:

java - 在 JBoss 中部署时覆盖 spring-boot 应用程序属性

java - GoogleMaps v2 Android 的我的位置按钮,不显示

java - Quickbooks 在线公司MetaData java

java - 对象的集合并通过父类(super class)找到它们

java - 独立 Java 应用程序中的连接池

java - 成功认证 spring security 后的自定义响应

java - cron 表达式在指定时间运行作业?

java - LocalSessionFactoryBean 类型已弃用

Spring Boot Hibernate 无法反序列化 : invalid stream header: 3433302E

java - 如何通过JPA获取保存对象的id?