我遇到了IntelliJ使用Gradle获取自定义弹簧配置元数据的问题。
如果我使用初始化程序创建一个新的Spring Boot项目,请将Configuration Processor包含在依赖项中,在Gradle任务上,请设置以下任务,
创建一个包含以下内容的类:
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'
}
答案 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注释处理器,并进行以下设置:
这样做的好处是,您不需要运行完整的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>