Mapstruct注解处理器在使用Gradle项目的Intellij中似乎无法正常工作

8
我正在尝试使用Intellij 2017 Ultimate构建/运行一个使用MapStruct的Spring Boot应用程序。这是一个Gradle项目。我的问题是,IntelliJ似乎没有运行MapStruct注解处理器。我意识到我可以配置IntelliJ委托给Gradle构建过程(请参见这个),但我希望简单地配置IntelliJ使用APT自动生成必要的类。
我已经为我的项目启用了APT,但我的类仍然没有生成。
build.gradle(适用片段):
ext {
    mapstructVersion = '1.2.0.Final'
}

plugins {
    id 'net.ltgt.apt' version '0.15'
}

dependencies {
    // MapStruct support
    implementation group: 'org.mapstruct', name: 'mapstruct-jdk8', version: mapstructVersion
    annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: mapstructVersion
 }

IntelliJ配置:

enter image description here

然而,当我执行./gradle clean命令后再进行构建->重新构建项目操作时,我的out/production/classes/generated文件夹为空。

我是否需要额外做些什么来启用此项目中的APT?IntelliJ是否会自动检测类路径中的mapstruct注解处理器?


1
看起来IntelliJ已经拾取了配置(默认组件模型已经存在)。你能否更改一下你的映射器,看看是否会发生什么变化。由于IntelliJ执行增量编译的方式可能会导致不创建文件,如果没有进行任何更改。 - Filip
@Filip,同样的结果。它没有生成源文件。 - Jega
@Jega,你看到这个问题的答案了吗?https://dev59.com/06rka4cB1Zd3GeqPZy8i#51169211? - Filip
是的,我尝试了相同的操作,但在Intellji 2018 CE上仍无法工作。我只能看到“out”目录中的空生成文件夹,但在命令行上可以正常工作。 - Jega
6个回答

13

最终它与Intellji 2018.1 CE良好运作,我们不需要任何apt插件。

这是更新后的gradle文件。

plugins {
    id 'java'
}

repositories {
       mavenCentral()
       mavenLocal()
}
sourceCompatibility = JavaVersion.VERSION_1_8


dependencies {
      compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: '1.2.0.Final'
      compileOnly 'org.mapstruct:mapstruct-processor:1.2.0.Final'
      annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'
      compileOnly ("org.projectlombok:lombok")
      testCompile 'junit:junit:4.12'
}

请确保以下内容已正确配置:

  1. 启用注解处理器(偏好设置->构建执行部署->编译器->注解处理器)

  2. MapStruct插件

  3. Lombok插件


这是一个正确的解决方案,但对我来说并不顺利。看起来 IntelliJ 没有捕捉到配置。我不得不在 IDE 中关闭项目,手动删除“out”文件夹中的内容,重新打开项目,并更改我的映射器类以引起自动重建。在我这样做之前,“out/production/classes/generated”文件夹是空的。 - naXa stands with Ukraine
谢谢@Jega。这正是我需要的,即使官方文档也不能正常工作。 - Pranay Kumbhalkar

7
我的build.gradle文件:
plugins {
    id 'java'
    id 'idea'
}

ext {
    mapstructVersion = '1.2.0.Final'
}

dependencies {

    // bean mapping
    compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: mapstructVersion
    compileOnly group: 'org.mapstruct', name: 'mapstruct-processor', version: mapstructVersion
    annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: mapstructVersion

}

尝试刷新并重新构建您的项目。如果对您不起作用,请继续查看下面的故障排除部分。

故障排除

如果对您不起作用...

  1. Enable Annotation Processors manually.
    It seems to be a bug in IDEA related to annotationProcessor configuration.

    IntelliJ IDEA -> Configure Annotations Processors (click to enlarge the screenshot)

  2. Check out build output in "out/production/classes/generated" folder. If it's empty, try to rebuild your project. Make sure changes are applied by manually deleting contents of build output folders and modifying your mapper class before the rebuild.

     $ rm -rf out build .gradle
    
  3. Verify your Gradle build file by building and running the project outside of IntelliJ IDEA.

  4. Try to delegate build actions to Gradle. I don't use this option, because annotation processor works for me anyway.

    IntelliJ IDEA -> Delegate build/run actions to Gradle

  5. Update to IntelliJ IDEA 2018.3 or later.


2

如果您正在使用Kotlin,我们将无法在类路径中发现注释处理器。您需要在build.gradle.kts中像下面这样放置依赖项:

kapt {
    dependencies {
        kapt("org.mapstruct:mapstruct-processor:1.4.2.Final")
    }
}

只是要补充一下,我们需要先导入插件,即kotlin("kapt") - 参考 - https://kotlinlang.org/docs/kapt.html#using-in-gradle - Amarnath Reddy Dornala

1
你需要使用net.ltgt.apt-idea插件,它会自动配置IntelliJ IDEA。
plugins {
    id 'net.ltgt.apt-idea' version '0.17'
}    
dependencies {
    compile('org.mapstruct:mapstruct-jdk8:1.2.0.Final')
    apt('org.mapstruct:mapstruct-processor:1.2.0.Final')
}

请注意,在最新的Gradle版本中,apt已经被弃用,应该使用annotationProcessor。然而,IntelliJ仍然不支持它。请参见IDEA-187868

0
我正在使用Tomcat EE服务器运行Spring应用程序。 对我来说,以下操作有效: 在“编辑配置> VM选项”中添加以下行。
-Xms1024m -Xmx1024m -XX:MaxPermSize=256m

0

以下是我发现的问题,希望对大家有所帮助。

问题1:生成的实现类本身没有被生成

  1. 确保您只有一个正确的mapstruct依赖项,多个依赖项会导致问题
  2. 确保在IntelliJ中启用了注释处理,并安装了lombok和mapstruct插件。

问题2:在mapstruct生成的实现类中找不到字段

  1. 当没有手动添加getter/setter并且使用lombok作为getter/setter时,如果在lombok之前处理mapstruct,则可能出现此问题。 因此,请确保在gradle文件中,您首先使用lombok处理依赖项,然后再使用mapstruct处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接