出于测试原因,我编写了AnnotationProcessor,但它不是由maven执行的。
我正在使用Google的“自动服务”为我创建META-INF数据。
这是处理器:
@SupportedAnnotationTypes({ "test.TestAnnotation" })
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@AutoService(Processor.class)
public class AnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
System.out.println("Test");
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Test");
return true;
}
}
我还尝试引发异常,创建文件,使用断点运行mvnDebug等。
这是提供处理器的项目的重要组成部分(其余只是groupId,命名等):
<dependencies>
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-proc:none</compilerArgument>
</configuration>
</plugin>
</plugins>
</build>
这是使用注释生成代码的项目POM的重要部分:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>Annotation</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
</plugins>
</build>
我的最终目标是让项目将我的注释处理器添加为依赖项,并且可以立即使用(有点像龙目岛)。
修改 测试注释正在测试类上使用。
答案 0 :(得分:0)
删除proc:none
参数。
它将跳过注释过程。这样@AutoService
将无法正常工作。
或者您可以手动添加Java服务文件。
答案 1 :(得分:0)
所以它开始有意义。
您的编译器插件设置有效地禁用了任何注释处理。这是必需的,因为否则编译器将找到服务文件,并尝试加载尚未可用的注释处理器(它将随此模块一起提供)。
但是在那种情况下,您的服务文件也不会生成。因此,不会在目标模块中调用您的处理器。
为了解决您的问题,您可以尝试使用其他方式指定要使用的注释处理器。
例如您可以尝试提供注释处理器路径(从而禁用类路径上的注释处理器查找):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc4</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
然后不需要<compilerArgument>-proc:none</compilerArgument>
。
答案 2 :(得分:0)
以下pom有效。 Maven在这里非常严格。在其中没有带有Path或注解ProcessorPath的annotationProcessorPaths,没有带有注解Processor的annotationProcessor(据我所知,这些都带有现成的罐子。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>10</source>
<target>10</target>
<outputDirectory>${generatedSources}</outputDirectory>
<annotationProcessorPath>
<artifactId>processing</artifactId>
<name>annotation_processing</name>
<version>0.0.1-SNAPSHOT</version>
</annotationProcessorPath>
</configuration>
</plugin>
Maven成功编译并安装。