java - ServiceLoader未找到任何服务

标签 java maven annotation-processing maven-compiler-plugin module-info

我遇到了 ServiceLoader 找不到所提供的服务的问题。

我已经使用常规项目和以下来源进行了测试:

// test/Tester.java
package test;

public interface Tester {
}

// test/TesterImpl.java
package test;

public class TesterImpl implements Tester {
}

// test/Runner.java
package test;

import java.util.ServiceLoader;

public class Runner {
    public static void main(String[] args) {
        var loader = ServiceLoader.load(Tester.class);
        for (var tester : loader) {
            System.out.println(tester);
        }
    }
}

// module-info.java
import test.Tester;
import test.TesterImpl;

module module {
    uses Tester;
    provides Tester with TesterImpl;
}

上面打印了类似于 test.TesterImpl@1fb3ebeb 的内容,证明它可以按需要工作。

当我尝试在通过 maven-compiler-plugin 运行的 AbstractProcessor 内使用 ServiceLoader.load(...) 时,同样无法工作。相反,处理器返回一个空迭代器。需要什么才能使其在注释处理器中的行为与上述情况相同?

最佳答案

此问题的解决方案是指定一个类加载器 - 看来注释处理器使用的类加载器与我尝试从中加载服务的类不同。解决办法如下:

ServiceLoader.load(MyService.class, MyAnnotationProcessor.class.getClassLoader())

关于java - ServiceLoader未找到任何服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71023598/

相关文章:

java - Jenkins 和 Tomcat 7 - 已部署应用程序,但上下文无法启动

Java - 注解处理

spring-boot - 无法在带有注解处理器配置的Gradle 5中使用Maven BOM

java - 算法博彩游戏

java - SAX 解析器在换行后不读取

java - 无法将插件目标绑定(bind)到 Maven 生命周期阶段

Java 注解处理 Messager API 消息未显示

java - 用循环处理棋盘游戏字段?

java - 如何解决子模块中的 Gradle Dependency 不一致?

java - 如何在 Manifest 文件中包含 Maven 依赖项