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

nwwlzxa7  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(107)

我有一个使用Gradle构建的Java项目,使用MapStruct代码生成器生成Map代码。我有意启用了弃用警告,因为我想知道如果我最终调用了弃用的代码,例如在升级库版本时。
我有一个MapStructMap器接口(用@Mapper注解),包含一个Map方法。该Map方法(它使用的自定义Map方法之一)正在被一个功能使用,该功能将在软件的下一个主要发布版本中删除,但需要保留在该点之前的次要版本中。因此,我将这两个方法标记为@Deprecated,以便传达它们将消失的信息,并确保在删除其他不推荐使用的代码时不会错过删除它们。
当我编译代码时,我在MapStruct为mapper接口自动生成的具体类中得到两个弃用警告:一个是实现弃用的Map方法,另一个是调用自定义mapper方法。
目标
我希望有一种方法可以防止发出这些弃用警告,同时仍然为我自己的(非自动生成的)代码保留弃用警告。
如果我手写了代码,我会用@Deprecated注解它,这会抑制这个警告。或者,有@SuppressWarnings("deprecation")选项来抑制它。然而,MapStruct目前是doesn't allow adding annotations to its generated code
我想到的另一个选择是,Gradle中可能有一种方法可以只为生成的类(在build/generated/sources/annotationProcessor/java中)启用弃用警告,而不是为手写的类(在src/main/java中)启用弃用警告。我没有看到这样做的方法。有一个九年前的旧论坛帖子discussing the issue,尽管我不知道如何将其应用于当前的Gradle环境。
如何在不禁用项目中未生成代码的弃用警告的情况下抑制自动生成的Map器类弃用警告?

示例

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; }
}

x

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;
    }
}

t2a7ltrp

t2a7ltrp1#

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

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

h7wcgrx3

h7wcgrx32#

即将到来的MapStruct 1.6.0版将自动将@Deprecated注解复制到生成的代码中,每个问题#2773。这将防止给定示例中的弃用警告。

相关问题