【问题标题】:How can I generate Mapstruct mapper implementations for test scope mapper interface in Gradle build?如何在 Gradle 构建中为测试范围映射器接口生成 Mapstruct 映射器实现?
【发布时间】:2019-06-21 09:00:57
【问题描述】:

我有一个简单的 Java 单模块 Gradle 项目,我在其中使用 Mapstruct 进行 Java 映射。我的build.gradle 看起来像这样:

plugins {
    id 'java-library'
    id 'groovy'
    id 'net.ltgt.apt' version '0.20'
}

repositories {
    jcenter()
}

dependencies {
    implementation 'org.mapstruct:mapstruct-jdk8:1.2.0.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'

    testImplementation 'org.codehaus.groovy:groovy-all:2.5.5'

    // Use the awesome Spock testing and specification framework even with Java
    testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
    testImplementation 'junit:junit:4.12'
}

sourceSets {
    main {
        java {
            srcDirs "${project.buildDir}/generated/sources/annotationProcessor/java/main"
        }
    }
    test {
        java {
            srcDirs "${project.buildDir}/generated/sources/annotationProcessor/java/test"
        }
    }
}

我的源文件夹包含以下 Java 源代码:

src
├── main
│   ├── java
│   │   └── ch
│   │       └── silviowangler
│   │           ├── Person.java
│   │           ├── SomeMapper.java
│   │           └── User.java
│   └── resources
└── test
    ├── groovy
    │   └── ch
    │       └── silviowangler
    ├── java
    │   └── ch
    │       └── silviowangler
    │           └── YoloMapper.java
    └── resources

SomeMapper 是一个简单的映射器界面,看起来像这样

@Mapper
public interface SomeMapper {

    @Mappings({
            @Mapping(target = "firstName", source = "nickname"),
            @Mapping(target = "surname", ignore = true),
            @Mapping(target = "dateOfBirth", ignore = true)
    })
    Person fromString(User user);
}

而位于测试范围内的YoloMapper 看起来像这样

@Mapper
public interface YoloMapper {

    String fromLocalDate(LocalDate localDate);
}

当我运行./gradlew clean cTJ 时,构建成功完成,注释处理器为SimpleMapper 生成映射器实现,但它不会为YoloMapper 生成任何内容。构建后的build 文件夹看起来像

build
├── classes
│   └── java
│       ├── main
│       │   └── ch
│       │       └── silviowangler
│       │           ├── Person.class
│       │           ├── SomeMapper.class
│       │           ├── SomeMapperImpl.class
│       │           └── User.class
│       └── test
│           └── ch
│               └── silviowangler
│                   └── YoloMapper.class
├── generated
│   └── sources
│       └── annotationProcessor
│           └── java
│               ├── main
│               │   └── ch
│               │       └── silviowangler
│               │           └── SomeMapperImpl.java
│               └── test
└── tmp
    ├── compileJava
    └── compileTestJava

如何让 Gradle 告诉注解处理器在测试范围内生成 Mapstruct 映射器实现?

【问题讨论】:

  • 你需要在你的依赖中配置testAnnotationProcessor配置:testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'
  • @M.Ricciuti 谢谢。这行得通。我之前应该想到过 :( 如果您将此添加为答案,我会接受它。

标签: java gradle mapstruct


【解决方案1】:

需要配置testAnnocationProcess配置,如下:

dependencies{

    // for Main sources set
    implementation 'org.mapstruct:mapstruct-jdk8:1.2.0.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'

    // for Test sources set  
    testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.2.0.Final"

}

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 2016-07-14
    • 1970-01-01
    • 2022-11-07
    • 2020-08-02
    • 2019-12-03
    • 1970-01-01
    • 2021-02-17
    • 2021-11-22
    相关资源
    最近更新 更多