如何在调试/运行 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 增量构建,因为 processResources
和 bootBuildInfo
任务共享相同的输出文件 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 应用程序时如何显示自动配置报告