如何让 Intellij 识别 application.yml 中的属性

How to get Intellij to recognize properties in application.yml

我正在尝试让 Intellij 使用 gradle 识别我的属性。我已按照步骤 here 进行操作。所以这意味着我有一个带有一些属性的 @ConfigurationProperties 注释 class 。

我添加了 spring 依赖来处理它们:

dependencies {
    optional "org.springframework.boot:spring-boot-configuration-processor"
}

compileJava.dependsOn(processResources)

我添加了插件(我试过不使用插件,只是让它成为一个编译依赖,没有改变)

buildscript {
    repositories {
        maven { url 'http://repo.spring.io/plugins-release' }
    }
    dependencies { classpath 'io.spring.gradle:propdeps-plugin:0.0.9.RELEASE' }
}

apply plugin: 'propdeps'
apply plugin: 'propdeps-maven'
apply plugin: 'propdeps-idea'

当我 运行 构建时,我看到一个 build/classes/java/main/META-INF/spring-configuration-metadata.json 文件是根据我的属性创建的。 当我尝试在 application.ymlapplication.properties 中使用 属性 时,Intellij 说它无法解析它。

文档确实说它应该被称为 additional-spring-configuration-metadata.json 并且可能期望它被调用来处理它,但我没有看到一种方法来使构建名称那样,也没有配置 Intellij 来期望否则。

有人用 gradle 解决这个问题吗?或者这是一个错误。

编辑 我用两个项目创建了一个 repo 来演示这一点。一个用于 gradle,一个用于 Maven。我从 start.spring.io 创建了项目,基本上只是添加了属性配置。在这两种情况下,我还使用了直接编译依赖项,而不是可选的/compileOnly。

我之前没有确认过这一点,但是代码辅助确实适用于 maven,但不适用于 gradle。两者都在各自的构建文件夹中的 META-INF 中创建了一个 spring-configuration-metadata.json。我不太确定谁没有捡起它。

其他相关版本

Intellij: 2017.3.4
Springboot: 1.5.9
Gradle: 4.4.1
Java: 8.161

据我所知,IntelliJ(在撰写本文时,2018.1.2)希望 spring-configuration-metadata.json 文件位于主源根目录 (src/main/resources/META-INF/ or src/main/java/META-INF/) 或它的默认输出目录,供它选择以自动完成源代码树中的属性。要扩展 phospodka 的评论,您可以将类似的内容添加到您的 build.gradle 以满足 IntelliJ。

task copyConfigurationMetadata(type: Copy) {
    from(compileJava) {
        include 'META-INF/spring-configuration-metadata.json'
    }
    into "out/production/classes"
}
compileJava {
    dependsOn processResources
    finalizedBy copyConfigurationMetadata
}

这个答案是(此时)其他两个答案的组合,稍作改动。就我而言,这就是 "fixed" 问题:(2019.03.01-Ultimate)

  • 打开默认注释处理(文件>设置>构建、执行、部署>注释处理器>启用注释处理

    • Select 从项目类路径获取处理器
    • Select 相对于模块输出目录存储生成的源代码
    • 保持其他默认值
    • 点击确定
  • 将@thyme 的回答中的代码添加到您的 build.gradle

    • EXCEPT 而不是 into "out/production/classes"
    • 使用:into "build/generated/sources/annotationProcessor"

现在您应该能够 运行 gradle clean/build 并且 Intellij 应该能够找到您的 "additional metadata" 定义。

请注意,即使 build.gradle 代码没有明确提及 'additional-spring-configuration-metadata.json',但正是 "additional metadata" 在 annotationProcessor 文件夹中作为 "spring-configuration-metatdata.json" 结束,其中Intellij 找到了。

编辑:另请注意,在 Intellij 看到新条目(在新生成的文件中)之前,您需要在添加任何新的 "additional metadata" 项目后清理/重建。