当前位置: 首页 > 知识库问答 >
问题:

在Gradle中,可以在MapSTRt注释处理器自动生成的代码中防止弃用警告吗?

戚逸清
2023-03-14

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

我有一个MapSTRt映射器接口(用@Mapper注释),其中包含一个映射方法。映射方法

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

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

如果我手写了代码,我会用@Deprecated对其进行注释,这将抑制此警告。或者,有@SuppressWarings("Deprecation")选项来抑制它。但是,MapSTRt目前不允许向其生成的代码添加注释。

我想到的另一个选项可能是,Gradle中有一种方法可以仅为生成的类(在构建/生成/源代码/注释处理器/java中)启用弃用警告,而不是手动编写的类(在src/main/java中)。我看不到这样做有任何下降。九年前论坛上有一篇老帖子讨论了这个问题,但我不知道如何将其应用到当前的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;
    }
}

共有1个答案

黄景胜
2023-03-14

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

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

 类似资料:
  • 我正在编写一个简单的java注释处理器,它使用JavaPoet生成java类,然后将其写入文件管理器。 这个注释处理器正在将文件保存到中,而不是 我尝试将maven编译器插件中目录设置为生成的sources目录,但它仍然在class文件夹中生成它。 如何将生成的类保存在生成的源文件夹中?

  • 问题内容: 升级到gradle 4.7之后,我以前没有警告的版本现在发出以下警告: 在编译类路径上检测到以下注释处理器:“ lombok.launch.AnnotationProcessorHider $ AnnotationProcessor”和“ lombok.launch.AnnotationProcessorHider $ ClaimingProcessor”。 不建议在编译类路径上检测注

  • null 我的git和Gradle技能是初学者水平。我将非常感谢对这项任务的任何帮助。谢谢你。

  • 升级到4.7级后,我以前的无警告版本现在发出以下警告: 在编译类路径上检测到以下注释处理器:'lombok.launch.annotationProcessorHider$annotationProcessorHider'和'lombok.launch.annotationProcessorHider$ClaimingProcessor'。不赞成在编译类路径上检测注释处理器,Gradle5.0将忽

  • 问题内容: 我们的项目使用XJC从XSD生成Java类。我正在使用JAVA EE 6。 当我们所有的XSD重新生成时,生成的类在文件顶部包含以下注释: 是否可以取消此评论?原因是我们使用SVN进行版本控制,并且每次重新生成类时,每个单独的文件都显示为已在SVN中进行了更改,即使唯一的区别是此注释。因此,如果可能的话,我想完全删除该评论。 有一个指令,但是我不想删除整个标头,以使子孙后代知道它是从工