gpt4 book ai didi

java - 错误的服务配置文件,或构造 Processor 对象时抛出的异常

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:36 24 4
gpt4 key购买 nike

我正在用 Java 编写一个简单的自定义注释,但遇到了问题。这是我的代码的主要部分。

LogMeCustomAnnotation.java

package fun.n.learn.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

// We need this annotation only till before compilation.
@Retention(RetentionPolicy.SOURCE)
// This is a simple custom annotation.
public @interface LogMeCustomAnnotation {

}

LogMeCustomAnnotationProcessor.java

package fun.n.learn.annotation;

import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;

// List the custom annotations that are supported.
@SupportedAnnotationTypes({ "fun.n.learn.annotation.LogMeCustomAnnotation" })
// Extend AbstractProcessor. This will let you process.
public class LogMeCustomAnnotationProcessor extends AbstractProcessor {

@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {

Messager messager = processingEnv.getMessager();
messager.printMessage(Diagnostic.Kind.NOTE, "I was here.");

// TODO: Put some meaningful code here. Right now just get it to work.

// return false;
// We have already handled these annotations. No more. So return true.
return true;
}

}

/src/main/resources/META-INF/services/javax.annotation.processing.Processor

fun.n.learn.annotation.LogMeCustomAnnotationProcessor

pom.xml

<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>fun.n.learn</groupId>
<artifactId>javaCustomAnnotation</artifactId>
<version>0.1.0</version>

<build>
<plugins>
<plugin>
<!-- Configure the project to use java 8 version. -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<!-- Disable annotation processing for ourselves. -->
<!-- <compilerArgument>-proc:none</compilerArgument> -->
</configuration>
</plugin>
</plugins>
</build>


</project>

现在,当我运行 mvn -e clean install 时,出现以下问题

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider fun.n.learn.annotation.LogMeCustomAnnotationProcessor not found
[INFO] 1 error

我一定是错过了一个简单的技巧。有什么帮助吗?

最佳答案

默认的 maven 生命周期运行 javac,javax.annotation.processing.Processor 文件作为类路径的一部分。这导致编译器期望文件中列出的注释处理器的编译实例。但是 LogMeCustomAnnotationProcessor 在那一刻没有编译,所以编译器会引发“Bad service configuration file ...”错误。参见 bug report .

为了解决这个问题,可以将maven编译阶段分开,先编译注解处理器,再编译整个项目。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<compilerArgument>-proc:none</compilerArgument>
<includes>
<include>fun/n/learn/annotation/LogMeCustomAnnotationProcessor.java</include>
<!--include dependencies required for LogMeCustomAnnotationProcessor -->
</includes>
</configuration>
</execution>
<execution>
<id>compile-project</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

default-compile 执行编译 LogMeCustomAnnotationProcessor 并禁用注释处理,以便成功编译。
compile-project 编译整个项目并进行注解处理。

关于java - 错误的服务配置文件,或构造 Processor 对象时抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36248959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com