如何在调试/运行 Spring Boot 项目的 IntelliJ“out”目录中生成 build-info.properties?

Posted

技术标签:

【中文标题】如何在调试/运行 Spring Boot 项目的 IntelliJ“out”目录中生成 build-info.properties?【英文标题】:How do I generate build-info.properties in the IntelliJ "out" directory on debug/run for a Spring Boot project? 【发布时间】: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 选项对我有用。请考虑将此作为答案提交。 【参考方案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。

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

    在主资源目录 (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 目录中

    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 项目中的虚拟文件? 重新打包不起作用

以上是关于如何在调试/运行 Spring Boot 项目的 IntelliJ“out”目录中生成 build-info.properties?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot,如何查看 Zuul 的调试信息?

Flyway 在 Spring Boot 上不工作时如何调试?

运行 Spring Boot 应用程序时如何显示自动配置报告

spring boot项目如何测试,如何部署

无法使用 intelliJ Idea 打开 Spring Boot 调试的调试器端口

intellij idea 怎么找不到spring boot