【问题标题】:Gradle custom compilationGradle 自定义编译
【发布时间】:2017-07-14 02:15:03
【问题描述】:

我想实现以下我在 gradle 中使用 maven 所做的事情:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.1</version>
        <executions>
            <!-- 1. Exclude Default Compiler -->
            <execution>
                <id>default-compile</id>
                <phase>none</phase>
            </execution>
            <!-- 2. Compile without Mappers. -->
            <execution>
                <id>Compile without Mappers</id>
                <goals>
                    <goal>compile</goal>
                </goals>
                <configuration>
                    <excludes>
                        <exclude>**/**/mapper/**/*</exclude>
                    </excludes>
                </configuration>
            </execution>
            <execution>
                <!-- 3. Compile Mappers -->
                <id>Compile Mappers</id>
                <goals>
                    <goal>compile</goal>
                </goals>
                <configuration>
                    <includes>
                        <include>**/**/mapper/**/*</include>
                        <include>${project.build.directory}/classes/**/*</include>
                    </includes>
                    <annotationProcessors>
                        <processor>org.mapstruct.ap.MappingProcessor</processor>
                    </annotationProcessors>
                </configuration>
            </execution>
        </executions>
    </plugin>

我正在做的是禁用默认编译,编译除我的 Mapstruct 映射器之外的所有源文件,然后编译 Mapstruct 映射器,包括之前编译的源。我是 gradle 新手,不知道如何实现类似的目标。到目前为止,我尝试过的如下:

task compileWithoutMapperClasses(type: JavaCompile) {
    options.incremental = true
    // Compile without Mappers
    sourceSets.main.java.exclude '**/**/mapper/**/*'
}


task compileMapperClasses(type: JavaCompile) {
    sourceSets.main.java.include '**/**/mapper/**/*'
    sourceSets.main.java.include 'build/classes/**/*'

    options.define(
        compilerArgs: [
            "-nowarn",
            "-proc:only",
            "-encoding", "UTF-8",
            "-processor", "org.mapstruct.ap.MappingProcessor",
        ]
    );
}

compileMapperClasses.dependsOn compileWithoutMapperClasses
compileJava.dependsOn compileWithoutMapperClasses

结果实际上是什么都没有编译。我想这样做的原因是我想在我的项目中使用 lombok 和 mapstruct。

【问题讨论】:

    标签: maven gradle compilation mapstruct


    【解决方案1】:

    试试

    task compileMapperClasses(type: JavaCompile) {
        includes '**/**/mapper/**/*'
        includes 'build/classes/**/*'
    
        options.define(
            compilerArgs: [
                "-nowarn",
                "-proc:only",
                "-encoding", "UTF-8",
                "-processor", "org.mapstruct.ap.MappingProcessor",
            ]
        );
    }
    

    更多信息,请关注JavaCompile任务https://docs.gradle.org/current/dsl/org.gradle.api.tasks.compile.JavaCompile.html的配置

    【讨论】:

    • 如果您使用 MapStruct 1.2.0.Beta1 和 Lombok 1.16.14,它应该与单个编译一起工作。我们的两个团队共同努力确保 MapStruct 可以“看到”Lombok 所做的 AST 修正。
    • 有没有一个例子是如何用 gradle 来实现的?使用上述版本并不能解决我的问题。
    • mapstruct-examples 存储库中有一个示例。这适用于@Gunnar 在他的评论中写的版本
    • @Martin 我正在我的 gradle 插件中定义一个自定义注释处理器。该插件应该为每个模块定义一个JavaCompile 任务并将-processor 作为一个apt 传递。当我定义-processor MyProcessor::class.java.canonicalName 我得到这个问题Annotation processor 'com.shaddowface.shuttle.plugin.processors.ShuttleProcessor' not found 知道为什么吗?
    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多