上下文:我想创建一个注释,它在生产环境中创建编译时错误,该环境在开发环境中被抑制。这个注释将用于模拟代码,以确保它永远不会从开发到生产。
我已经将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参数中,有没有办法全局抑制特定的注释或注释处理器?