微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Gradle 中,能否在 MapStruct 注释处理器自动生成的代码中防止弃用警告?

如何解决在 Gradle 中,能否在 MapStruct 注释处理器自动生成的代码中防止弃用警告?

我有一个使用 Gradle 构建的 Java 项目,使用 MapStruct 代码生成生成映射代码我有意启用了弃用警告,因为我想知道我是否最终调用了弃用的代码,例如升级库版本时。

我有一个包含映射方法的 MapStruct 映射器接口(用 @Mapper 注释)。映射方法及其使用的 custom mapping methods 之一正被一项功能使用,该功能将在软件的下一个主要版本中删除,但需要保留在该点之前的次要版本中。因此,我将这两种方法标记@Deprecated 以表明它们即将消失,并确保在删除其他已弃用代码时不会错过删除它们。

当我编译代码时,我在 MapStruct 为映射器接口自动生成的具体类中收到两个弃用警告:一个用于实现已弃用的映射方法,另一个用于调用自定义映射器方法

目标

我希望有一种方法可以防止发出这些弃用警告,同时仍然为我自己的(非自动生成的)代码保留弃用警告。

如果我手写了代码,我会用 @Deprecated 对其进行注释,这会抑制此警告。或者,有 @SuppressWarnings("deprecation") 选项可以抑制它。但是,MapStruct 目前doesn't allow adding annotations to its generated code

我想到的另一个选项可能是 Gradle 中有一种方法可以为生成的类(在 build/generated/sources/annotationProcessor/java 中)启用弃用警告,而不是为手写类(在 src/main/java 中)启用弃用警告。我没有看到这样做的直接方式。有一个 9 年前 discussing the issue 的旧论坛帖子,但我不确定如何将其应用于当前的 Gradle 环境。

如何在不禁用项目中未生成代码的弃用警告的情况下抑制自动生成的映射器类弃用警告?

示例

build.gradle

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
    implementation 'org.mapstruct:mapstruct:1.4.2.Final'
}

compileJava {
    options.deprecation = true
}

Java 类

public class Source {
    private String value;
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}
public class Target {
    private String value;
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}
import org.mapstruct.Mapper;

@Mapper
public interface ExampleMapping {
    @Deprecated
    Target map(Source source);

    @Deprecated
    default String mapString(String s) {
        return s.toupperCase();
    }
}

构建输出

$ ./gradlew build

> Task :compileJava
/path/to/project/build/generated/sources/annotationProcessor/java/main/com/example/ExampleMappingImpl.java:13: warning: [deprecation] map(Source) in ExampleMapping has been deprecated
    public Target map(Source source) {
                  ^
/path/to/project/build/generated/sources/annotationProcessor/java/main/com/example/ExampleMappingImpl.java:20: warning: [deprecation] mapString(String) in ExampleMapping has been deprecated
        target.setValue( mapString( source.getValue() ) );
                         ^
2 warnings

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

生成代码

import javax.annotation.processing.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",date = "2021-07-16T22:41:15-0500",comments = "version: 1.4.2.Final,compiler: IncrementalProcessingEnvironment from gradle-language-java-7.1.1.jar,environment: Java 11.0.9.1 (AdoptOpenJDK)"
)
public class ExampleMappingImpl implements ExampleMapping {

    @Override
    public Target map(Source source) {
        if ( source == null ) {
            return null;
        }

        Target target = new Target();

        target.setValue( mapString( source.getValue() ) );

        return target;
    }
}

解决方法

弃用警告只能在编译级别全局关闭。因此,要仅为生成的映射器禁用它们,您必须单独编译它。最简单的解决方案是将模型和映射器放在单独的模块中。然后在映射器模块中,只需禁用映射器模块的“主要”源集的弃用警告:

tasks.named('compileJava',JavaCompile).configure {
    it.options.deprecation = false
}

至于测试编译,我猜您希望在那里有弃用警告:

tasks.named('compileTestJava',JavaCompile).configure {
    it.options.deprecation = true
}

以下是 GitHub 上的示例:https://github.com/jannis-baratheon/stackoverflow--mapstruct-mapper-compile-warnings

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。