【发布时间】:2017-07-12 14:55:06
【问题描述】:
是否可以在注释处理器的init(ProcessingEnvironment) 方法中使用ServiceLoader?
interface Service {}
class AnnotationProcessor extends AbstractProcessor {
public static void main(String[] args) {
ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
System.out.println("Found Services:");
for (Service service : loader) {
System.out.println(service);
}
}
@Override
public synchronized void init(ProcessingEnvironment env) {
super.init(env);
ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
System.out.println("Found Services:");
for (Service service : loader) {
System.out.println(service);
}
}
...
}
运行 main 方法会生成我在 META-INF/services 文件中指定的服务。但是,当 init(ProcessingEnvironment) 方法作为另一个项目的构建的一部分被调用时,它不会列出任何服务。
有没有办法让它工作?
【问题讨论】:
-
您能再描述一下您的设置吗?你有什么项目?您的服务在哪里定义?简短的回答是,是的,应该是可能的。但是您应该弄清楚为什么 META-INF/services 文件不在您的类路径中。运行 main 方法时的类路径是什么?
-
我正在使用 Maven 来处理项目之间的所有依赖关系,因此类路径现在有点神奇。不过,我会深入研究一下,看看是否能找到更好的答案。
-
我发现有趣的其他事情,当我从注释处理器中加载处理器服务(如注释处理器)时,我也得到了一个空列表。而且我知道类路径在那里设置正确,因为我在注释处理器中!
-
关于如何设置 maven 项目以及如何运行 main 方法的描述可能会有所帮助。
标签: java annotation-processing serviceloader