在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件
Posted
技术标签:
【中文标题】在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件【英文标题】:spring-configuration-metadata.json file is not generated in IntelliJ Idea for Kotlin @ConfigurationProperties class 【发布时间】:2016-10-17 22:47:36 【问题描述】:我正在尝试为基于 Spring Boot 的项目生成 spring-configuration-metadata.json 文件。如果我使用 Java @ConfigurationProperties 类,它会正确自动生成:
@ConfigurationProperties("myprops")
public class MyProps
private String hello;
public String getHello()
return hello;
public void setHello(String hello)
this.hello = hello;
但如果我使用 Kotlin 类,则不会生成 spring-configuration-metadata.json 文件(我已经尝试过 gradle build 和 Idea Rebuild Project )。
@ConfigurationProperties("myprops")
class MyProps
var hello: String? = null
AFAIK Kotlin 使用构造函数、getter 和 setter 生成相同的类,并且应该充当常规 Java bean。
知道为什么 spring-boot-configuration-processor 不适用于 Kotlin 类吗?
【问题讨论】:
我似乎在使用 groovy 时遇到了同样的问题 尽管尝试了所有建议,但我遇到了同样的问题。我的环境——IntelliJ 2018.1.3 CE、SpringBoot 2.0.1、Kotlin 1.2.41 【参考方案1】:感谢您为我指明了正确的方向。所以解决方法是添加
dependencies
...
kapt "org.springframework.boot:spring-boot-configuration-processor"
optional "org.springframework.boot:spring-boot-configuration-processor"
...
到build.gradle文件,在命令行运行gradle compileJava并在IntelliJ Idea设置中开启注解处理Build, Execution, Deployment -> Compiler - > 注释处理器 -> 启用注释处理。其余配置保持the same
还要注意没有这一行
optional "org.springframework.boot:spring-boot-configuration-processor"
IntelliJ Idea 会抱怨
无法解析配置属性
application.properties 或 application.yml
中的消息【讨论】:
您能否针对 groovy 的相同问题提出解决方案? 正如 Stéphane Nicoll 所说,目前 Spring Boot 只支持 Java。在基于 Kotlin 的项目的工作中,我得出的结论是,最好将 Java 类用于自定义属性。其他一切都是编译器、编程语言和 IDE 的技巧和解决方法(目前)。 我使用 spring boot 1.4.0 在 kotlin 中运行良好。不使用 propdeps 或 java 端的任何东西。在我的 web 模块中,使用了所有配置,我添加了 kapt "org.springframework.boot:spring-boot-configuration-processor" 就是这样compileOnly
Gradle 4 中的范围【参考方案2】:
对于那些想要使用 Maven 而不是 Gradle 的人,您需要在 kotlin-maven-plugin 配置中添加一个 kapt
执行。
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/kotlin</sourceDir>
</sourceDirs>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>1.5.3.RELEASE</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
如果将诸如 kotlin-maven-allopen
之类的编译器插件声明为依赖项,则存在一个未解决的问题 KT-18022 会阻止此操作。
【讨论】:
上述问题已解决,我可以确认 Maven 解决方案在与 Kotlin 1.1.4 和 Spring Boot 1.5.6 一起使用时开箱即用。【参考方案3】:Kotlin 有自己的编译器。元数据由annotation processor 生成,它是 Java 编译器中的一个挂钩点。
我不知道 Kotlin 中是否有这样的挂钩点,但无论如何,Spring Boot 目前不支持 Java 以外的任何东西。也许this would help?
【讨论】:
这可能也有帮助:kotlinlang.org/docs/reference/…以上是关于在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 中的 java Maven 项目,如何找到不需要的依赖项?