IntelliJ不获取自己的Spring配置元数据

时间:2019-03-01 14:41:54

标签: spring-boot gradle intellij-idea

我遇到了IntelliJ使用Gradle获取自定义弹簧配置元数据的问题。

如果我使用初始化程序创建一个新的Spring Boot项目,请将Configuration Processor包含在依赖项中,在Gradle任务上,请设置以下任务,

gradle info

创建一个包含以下内容的类:

package com.example.demo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("mycustomconfig")
public class MyCustomConfig {

    private String name;

    public String getName() {
        return name;
    }

    public MyCustomConfig setName(String name) {
        this.name = name;
        return this;
    }
}

然后IntelliJ在类文件“在类路径中找不到Spring Boot配置注释处理器”中抱怨,即使它肯定在类路径中。

运行应用程序后,将在build/classes/java/main/META-INF/spring-configuration-metadata.json中生成一个文件,其内容如下:

{
  "groups": [
    {
      "name": "mycustomconfig",
      "type": "com.example.demo.MyCustomConfig",
      "sourceType": "com.example.demo.MyCustomConfig"
    }
  ],
  "properties": [
    {
      "name": "mycustomconfig.name",
      "type": "java.lang.String",
      "sourceType": "com.example.demo.MyCustomConfig"
    }
  ],
  "hints": []
}

但是IntelliJ然后在application.properties中抱怨:Cannot resolve configuration property "mycustomconfig.name".

同一实验在Maven上可以完美地工作。我在做错什么吗?

我正在使用IntelliJ 2018.3 Ultimate。

我的build.gradle是:

plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

3 个答案:

答案 0 :(得分:0)

不确定您是否解决了此问题,但我刚刚升级到2018.3 Ultimate,并遇到了相同的问题。我怀疑这是IntelliJ问题,但无论我如何通过添加以下行来解决它

implementation('org.springframework.boot:spring-boot-configuration-processor')

仅在我的gradle文件中的“ annotationProcessor”行上方...

希望有帮助

答案 1 :(得分:0)

最后,我找到了问题的原因。

注释处理器将spring-configuration-metadata.json输出到build / classes / java / main / META-INF`。

但是:IntelliJ使用不同的类路径进行解析。转到项目结构/模块/主模块/路径,您可以看到将编译器输出设置为“使用模块编译输出路径”,并指向out/production/classes。这是从Gradle自动解决的;更改后,只要您在Gradle中进行了任何更改,它就会还原。

我发现有两种可能性:

在IntelliJ Preferences / Build,Execution,Deployment / Compiler / Annotation Processors中手动配置Spring Boot注释处理器,并进行以下设置:

Annotation Processor configuration

这样做的好处是,您不需要运行完整的gradle构建-只需从IntelliJ进行编译即可。不幸的是,项目中的每个用户似乎都手动进行了设置。

第二种可能性在at this Stack overflow question中提到。在Gradle中设置此idea选项:

idea{
    module{
        inheritOutputDirs = false
        outputDir = compileJava.destinationDir
        testOutputDir = compileTestJava.destinationDir
    }
}

现在,这基本上为IntelliJ和Gradle使用了一个已编译的目标类。但是,如链接的URL中所述,似乎有些警告。

答案 2 :(得分:0)

如果您使用的是Maven,则添加此依赖性将解决此问题。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>