IntelliJ не берет собственные метаданные конфигурации Spring - PullRequest
0 голосов
/ 01 марта 2019

У меня проблемы с IntelliJ при получении пользовательских метаданных конфигурации Spring с Gradle.

Если я создаю новый проект Spring Boot с помощью Initializer, включите процессор конфигурации в зависимости в наборе задач 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Процессор аннотации конфигурации загрузки не найден в classpath ", даже если он определенно находится в classpath.

После запуска приложения в 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'
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Наконец, я нашел причину проблемы.

Процессор аннотаций выводит spring-configuration-metadata.json в build / classes / java / main / META-INF`.

Но : IntelliJ использует другой путь к классам для разрешения.Переходя к Структуре проекта / Модули / Основной модуль / Пути, вы можете видеть, что для вывода компилятора установлено значение «Использовать выходной путь компиляции модуля» и указывает на out/production/classes.Это решается из Gradle автоматически;изменение его будет отменено, как только у вас появятся какие-либо изменения в Gradle.

Я обнаружил, что есть две возможности:

Настроить обработчик аннотаций Spring Boot вручную в IntelliJ Preferences / Build, Execution,Процессоры развертывания / компиляции / аннотации со следующими настройками:

Annotation Processor configuration

Это дает то преимущество, что вам не нужно запускать полную сборку Gradle -Просто компиляция из IntelliJ работает.К сожалению, каждый пользователь в проекте, кажется, вручную настраивает это.

Вторая возможность упоминается в в этом вопросе переполнения стека .Установите следующие опции idea в Gradle:

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

В основном теперь используется один скомпилированный целевой класс как для IntelliJ, так и для Gradle.Похоже, что есть некоторые предостережения, как упоминалось в связанных URL.

0 голосов
/ 20 марта 2019

Не уверен, что вы решили эту проблему, но я просто обновился до 2018.3 Ultimate и столкнулся с той же проблемой.Я подозреваю, что это проблема IntelliJ, но независимо от того, что я решил ее, добавив следующую строку

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

Чуть выше строки "annotationProcessor" в моем файле gradle ...

Надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...