Java禁止特定注释

时间:2015-06-23 22:55:25

标签: java maven annotations

上下文:我想创建一个注释,它在生产环境中创建编译时错误,该环境在开发环境中被抑制。这个注释将用于模拟代码,以确保它永远不会从开发到生产。

我已经将Annotation和Annotation Processor创建为Maven项目。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com</groupId>
    <artifactId>Fail-Annotation</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <compilerArgument>-proc:none</compilerArgument>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

目前,注释本身非常简单

package com.fail.annotation;

public @interface Fail
{

    String value();
}

处理器同样简单

package com.fail.annotation;

import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;

@SupportedAnnotationTypes({"com.fail.annotation.Fail"})
public class FailProcessor extends AbstractProcessor
{

    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment re)
    {
        for (Element e : re.getElementsAnnotatedWith(Fail.class))
        {
            processingEnv.getMessager().printMessage(
                    Diagnostic.Kind.ERROR,
                    "Forced Fail: " + e.getAnnotation(Fail.class).value(),
                    e
            );
        }
        return true;
    }
}

当作为新项目中的依赖项包含时,注释可以完美地运行。

package com.faildemo;

import com.fail.annotation.Fail;

public class FailHere
{

    @Fail("Mock Data")
    int userid = 1;
}

我可以更改演示项目中的pom.xml以禁用注释处理器(-proc:none),但如果我们想在项目中使用其他注释处理器,这将不起作用。

我们可以手动指定要与maven annotationProcessors配置字段一起使用的处理器,但是我们必须手动编写每个处理器,这在大型项目中将是繁琐且容易出错的,特别是对于多个配置文件。

TL; DR:在maven和/或javac参数中,有没有办法全局抑制特定的注释或注释处理器?

0 个答案:

没有答案