【问题标题】:How do I generate build-info.properties in the IntelliJ "out" directory on debug/run for a Spring Boot project?如何在调试/运行 Spring Boot 项目的 IntelliJ“out”目录中生成 build-info.properties?
【发布时间】:2018-05-12 12:59:45
【问题描述】:

在我的 build.gradle 中,我添加了 spring 构建信息:

springBoot {
    mainClass = "${springBootMainClass}"

    buildInfo() {
        additionalProperties = [
                name: "${appName}",
                version: "${version}-${buildNumber}",
                time: buildTime()
        ]
    }
}

def buildTime() {
    final dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ")
    dateFormat.timeZone = TimeZone.getTimeZone('GMT')
    dateFormat.format(new Date())
}

当我从命令行运行时,这会正确地将 /META-INF/build-info.properties 文件添加到 /build/resources/main 中,以便 "/info" 端点以 JSON 格式显示构建信息。

当我从 IntelliJ 的运行/调试按钮运行时,IntelliJ 确实使用/build 目录,而是使用/out 目录并且也不运行该 gradle 任务,所以 @987654327 @endpoint 的 JSON 为空。

如何让它生成该文件并将其放在/out 目录中?

【问题讨论】:

  • 请在设置(首选项)中启用 将 IDE 构建/运行操作委托给 Gradle 选项 |构建、执行、部署 |构建工具 |摇篮 |跑步者选项卡。它有帮助吗?另一种解决方法是将“启动任务之前”的运行/调试配置从“构建”更改为“运行 Gradle 任务“构建””。
  • @andrey 设置 将 IDE 构建/运行操作委托给 Gradle 选项对我有用。请考虑将此作为答案提交。

标签: java spring spring-boot intellij-idea spring-boot-actuator


【解决方案1】:

启用将IDE构建/运行操作委托给Gradle选项在设置(首选项)|构建、执行、部署 |构建工具 |摇篮 | Runner 标签。

在最新的 IDE 版本中,为设置设置 Gradle(macOS 上的首选项)|构建、执行、部署 |构建工具 | Gradle | 使用选项构建和运行。

【讨论】:

  • 我遇到了一个新问题。使用此设置,它看不到我的类有任何更改(当我重新启动运行/调试配置时)。即使在命令行中进行重建项目或.gradlew clean 也不会使其看到代码中的更改。我如何让它真正重建一切?
  • 使用委托选项时,IDE 应使用 Gradle 编译器输出目录来编译类。您可以通过删除项目中的所有输出目录(例如 IDE 的默认 out 和 Gradle 的 build)来仔细检查它并通过 Build | 重建项目。重建项目操作并检查是否仅创建了 gradle ouptut 目录。然后检查 Gradle 的编译器输出目录中的类是否实际更新。
  • 等等这是怎么被接受的?它从根本上改变了 IDE 的工作方式,我不想这样做。还有其他解决方法吗?
  • 构建、执行、部署下没有运行器选项卡 |构建工具 | intellJ 中的 Gradle
【解决方案2】:

对于在 IntelliJ IDEA 社区版中遇到此问题的任何其他人(@Andrey 所说的选项不存在),您只需在启动前添加Run Maven Goal。这将在构建和运行之前执行插件的目标:spring-boot:build-info

【讨论】:

    【解决方案3】:

    我有完全相同的需求,出于不同(好的)原因,我不想使用“将 IDE 构建/运行操作委托给 Gradle”。

    在我的情况下,我不需要该文件 /META-INF/build-info.properties 在开发阶段在 IDEA 中是最新的,我只需要该文件在“运行”类路径中可用(在 /out/... 下),否则,当从 IDEA 运行/调试工具启动我的应用程序时,Spring 将无法创建和注入 BuildProperties bean。

    如果你也是我的情况,这是一个简单的解决方案:

    1. 在主资源目录 (src/main/resources/META-INF/build-info.properties) 中创建 build-info.properties 的虚拟“开发”(或“快照”)版本

      #DO NOT EDIT(将被 Spring Boot 插件覆盖) build.time=2019-05-07T11:32:31.581Z build.artifact=myapp build.group=org.mycompany build.name=myapp build.version=dev

    从 IDEA 构建项目时,此开发版本将自动复制到 IDEA /out/production/resources 目录中

    1. bootBuildInfo 任务和processResources 任务之间创建一个任务依赖关系,以确保Spring boot 插件在构建应用程序jar 时将使用最新版本覆盖“dev”版本:

      bootBuildInfo.mustRunAfter processResources

    这样,SpringBoot gradle 插件将覆盖 processResources 任务从源复制的文件,并使用其自动生成的最新文件。

    编辑 2020-10

    正如 Dmitry 在下面的评论中警告的那样,此解决方案将破坏 Gradle 增量构建,因为 processResourcesbootBuildInfo 任务共享相同的输出文件 build-info.properties。为避免这种情况,当我们检测到任务图中包含bootBuildInfo 任务时,我们可以在processResources 中添加排除以过滤掉该文件

    project.gradle.taskGraph.whenReady {
        if (it.allTasks.any {it.name == "bootBuildInfo"}) {
            processResources {
                exclude("META-INF/build-info.properties")
            }
        }
    }
    

    【讨论】:

    • 在哪里创建任务依赖?并且在生产中运行时还会发生覆盖吗?或者您的文件会在 IntelliJ 之外使用吗?
    • 依赖是在你的项目build.gradle下面的springBoot { }配置块中创建的,例如。我猜在生产中您使用 SpringBoot/gradle build: 生成的 Springboot jar :所以是的,该 jar 将包含 SpringBoot 插件生成的文件的最新版本。此文件的“开发”版本仅用于在 IDEA 中运行应用程序
    • 另外,不要忘记按照Filtering runtime classpath 中的说明配置 Gradle。这样它就忽略了build-info.properties 中的“更改”。否则,Gradle 构建缓存将按照您的预期“停止工作”。例如,如果将所谓的“dev”版本与在类路径中找到的生成的版本进行比较,即build-info.properties 文件已“更改”,那么即使它们没有更改,它也会重新运行所有测试,即@ 987654340@(默认)
    • 您的解决方案的第 1 部分对我来说效果很好,但我如何强制任务覆盖 maven 项目中的虚拟文件? 重新打包不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多