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

问题描述 投票:1回答:4

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

log me custom annotation.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 {

}

log me custom annotation processor.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;
    }

}

/双人床/卖弄/resources/meta-inf/services/Java小.annotation.processing.processor

fun.n.learn.annotation.LogMeCustomAnnotationProcessor

pom.hml

<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

我必须在这里错过一个简单的伎俩。有帮助吗?

java maven annotations
4个回答
11
投票

默认的maven生命周期使用javax.annotation.processing.Processor文件作为classpath的一部分运行javac。这会导致编译器期望文件中列出的注释处理器的已编译实例。但是LogMeCustomAnnotationProcessor当时没有编译,所以编译器引发“糟糕的服务配置文件...”错误。见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使用annotaton处理编译整个项目。


1
投票

好。发现了这个问题。早些时候,我的pom.xml已将proc:none行注释掉了。现在我已经恢复了它,它编译得很好。我需要确切地知道这条线的作用,但我的问题的答案就是把proc:none放回游戏中。这就是我的pom.xml的构建部分现在看起来的样子。

<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>

1
投票

请按照以下步骤解决此问题:

  • 编辑nbproject/project.properties文件
  • 搜索javac.processorpath,并将其更改为:

javac.processorpath=\ ${javac.classpath}:\ ${libs.eclipselink.classpath}


0
投票

我特别遇到了这个错误

Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider com.iviz.schemarestriction.processor.SchemaRestrictionCompilationProcessor could not be instantiated

将maven项目从JDK 1.8(1.8.0_201)迁移到OpenJDK 11(11.0.2)时。

它是通过添加依赖来修复的(2.3.1是最新的稳定版本)

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.