У меня возникают проблемы с тем, чтобы IntelliJ собирал пользовательские метаданные конфигурации Spring с помощью Gradle.
Если я создаю новый проект Spring Boot с инициализатором, включаю обработчик конфигурации в зависимости, в задаче 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'
}




Не уверен, что вы решили эту проблему, но я только что обновился до 2018.3 Ultimate и столкнулся с той же проблемой. Я подозреваю, что это проблема IntelliJ, но, тем не менее, я решил ее, добавив следующую строку
implementation('org.springframework.boot:spring-boot-configuration-processor')
Чуть выше строки "annotationProcessor" в моем файле gradle...
надеюсь, это поможет
Наконец-то я нашел причину проблемы.
Процессор аннотаций выводит spring-configuration-metadata.json в build/classes/java/main/META-INF`.
Но: IntelliJ использует другой путь к классам для разрешения. Перейдя в Структуру проекта/Модули/основной модуль/Пути, вы можете увидеть, что для вывода компилятора установлено значение «использовать выходной путь компиляции модуля» и указывает на out/production/classes. Это разрешается из Gradle автоматически; его изменение будет отменено, как только вы внесете какие-либо изменения в Gradle.
Я обнаружил, что есть две возможности:
Настройте обработчик аннотаций Spring Boot вручную в IntelliJ Preferences/Build, Execution, Deployment/Compiler/Annotation Processors со следующими параметрами:
Преимущество этого в том, что вам не нужно запускать полную сборку gradle - работает только компиляция из IntelliJ. К сожалению, кажется, что каждый пользователь в проекте настраивает это вручную.
Вторая возможность упоминается в в этом вопросе о переполнении стека. Установите эти параметры idea в Gradle:
idea{
module{
inheritOutputDirs = false
outputDir = compileJava.destinationDir
testOutputDir = compileTestJava.destinationDir
}
}
В основном теперь используется один скомпилированный целевой класс как для IntelliJ, так и для Gradle. Однако, похоже, есть некоторые предостережения, как указано в связанных URL-адресах.
Если вы используете Maven, добавление этой зависимости решит проблему.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>