【问题标题】:Mapstruct AnnotationProcessor with IntelliJ and Gradle带有 IntelliJ 和 Gradle 的 Mapstruct AnnotationProcessor
【发布时间】:2019-05-17 20:48:40
【问题描述】:

我正在尝试让 Mapstruct 注释处理器在 Gradle 项目中的 IntelliJ 中工作。

理想情况下,我希望所有配置都在 gradle 文件中,并且任何人都可以将项目导入 IntelliJ 并获得完整的设置,而无需手动设置任何首选项。

但我可以妥协。

我正在使用带有 Java 11 的 IntelliJ 2018.3 和 Gradle 5.0(即最新最好的)。 Mapstruct 版本是 1.2.0.FINAL。

我做了什么:

  • 在我的build.gradle 中配置了 Mapstruct 注释处理器:

    compile "org.mapstruct:mapstruct-jdk8:${mapstruct_version}"
    annotationProcessor "org.mapstruct:mapstruct-processor:${mapstruct_version}"
    
  • 在“构建、执行、部署 -> 构建工具 -> Gradle -> Runner”下的首选项中选择“将 IDE 构建/运行操作委托给 Gradle”

build/classes/java/main/com/myapp/mypackage/mapper/ 目录中,我看到MyMapperImpl.classMyMapperImpl.java,因此代码生成似乎可以工作。

现在我希望当我选择带注释的摘要 MyMapper 类并按 ctrlH 时,生成的 MyMapperImpl 会出现在层次结构视图中。

如果我手动将build/classes/java/main/ 标记为“生成的源”目录(我真的不想这样做,见上文),该类仍然不会出现在层次结构中。但是源代码标记有很多错误,因为显然没有找到我的项目中的类。

不用说:我可以从 IntelliJ 和命令行完美地运行使用映射器的测试。

【问题讨论】:

标签: java intellij-idea annotation-processing mapstruct


【解决方案1】:

使用this,我的团队也在使用mapstruct,我们在我们的 build.gradle,你还需要为 gradle 带来 idea 插件

def generatedSources = "$buildDir/generated"
def generatedOutputDir = file("$generatedSources")

/*
 create generated .java files in different folder than classes
 In IntelliJ 2016.3.x: Enable Annotation Processing, then set generated sources,
 relative to module output dir, at path '../../generated'
 */
compileJava {
    doFirst {
        generatedOutputDir.exists() || generatedOutputDir.mkdirs()
        options.compilerArgs = [
                '-s', "${generatedSources}"
        ]
    }
}


idea {
    module {
        downloadSources = true
        // tell intellij where to find generated sources
        sourceDirs += generatedOutputDir
    }
}

即使没有Gradle runner,您也可以使用此解决方法运行您的代码

【讨论】:

  • 我试过了,它解决了一个问题:生成的源代码不再出现在build/classes 目录中。但是,IDEA 仍然没有找到源代码(即使我手动将build/generatedout/generated 目录添加为“生成的源”)并且它都是红色的。我必须重新导入我的项目吗?我是否必须选择“Delegate ... to Gradle”?
  • 我忘了说这是一个多模块项目。将上述 sn -p 添加到 subprojects 后,IDEA 将所有 generated 目录作为源目录添加到根模块。我想要的是将它们添加到每个模块中。
猜你喜欢
  • 2016-12-21
  • 2015-06-23
  • 2016-11-16
  • 2019-02-22
  • 2018-09-07
  • 2018-08-06
  • 2018-09-11
  • 2016-03-15
  • 2020-02-07
相关资源
最近更新 更多