Java 无法加载批注处理器中的资源(不在类路径上)
我有一个注释处理器,它将使用接口的getter方法定义的键生成枚举 该接口位于 MyProject/src/main/java/my.package.MyInterfaces.java 我想验证驻留在MyProject/src/main/resources/META-INF/resource bundle/中的属性文件是否包含在生成的枚举中定义的键 我的问题是,属性文件无法通过处理器的类加载器或Filer.getResource 如何使该项目的源或类路径可供处理器使用,以便加载属性文件 现在我只有jar中处理器所在的可用资源。 我确实试图通过eclipse项目/Properties/Java编译器/Annotation processing/Processor选项定义-classpath和/或-sourcepath,但没有成功 有人遇到过这样的问题吗?有人能告诉我如何为处理器提供资源吗 我有maven结构,但不使用maven,因为应用程序中存在旧的依赖关系。所以maven现在不是我的选择 日食3.6太阳神 似乎文件资源中未实现StandardLocation.SOURCE\u路径和StandardLocation.CLASS\u路径,因此无法将生成的源文件或类文件写入源路径或类路径,也无法访问源路径和类路径上的任何文件* 谢谢 我的问题是,属性文件无法通过处理器的类加载器或Filer.getResource 我不确定我是否理解你的问题。但也许这里有些东西会有所帮助 如何使该项目的源或类路径可供处理器使用,以便加载属性文件 您需要在Eclipse中添加src/main/resources作为源文件夹。首先在Java项目上选择Eclipse中的配置构建路径。然后选择“源”选项卡并单击“添加文件夹”。您应该能够选择src/main/resources文件夹并单击Ok。您现在应该可以在源文件夹列表中看到src/main/resources 如果您查看target/classes目录,您应该会看到其中resources目录中的所有文件,这让您知道它们已正确复制到类路径中Java 无法加载批注处理器中的资源(不在类路径上),java,eclipse,annotation-processing,Java,Eclipse,Annotation Processing,我有一个注释处理器,它将使用接口的getter方法定义的键生成枚举 该接口位于 MyProject/src/main/java/my.package.MyInterfaces.java 我想验证驻留在MyProject/src/main/resources/META-INF/resource bundle/中的属性文件是否包含在生成的枚举中定义的键 我的问题是,属性文件无法通过处理器的类加载器或Filer.getResource 如何使该项目的源或类路径可供处理器使用,以便加载属性文件 现在我只
# files in the src main resources
> ls src/main/resources/x/y/z
jgroups_udp.xml
# should compile into target/classes
> ls target/classes/x/y/z
jgroups_udp.xml org
# and should show up in the jar
> -tvf target/project.jar
0 Thu Nov 03 18:50:00 EDT 2016 META-INF/
135 Thu Nov 03 18:49:58 EDT 2016 META-INF/MANIFEST.MF
...
3036 Thu Nov 03 18:49:36 EDT 2016 x/y/z/jgroups_udp.xml
然后在代码中,您可以通过执行以下操作来引用该文件。这将从类路径的顶部加载文件。如果在细分市场中,则您可以通过以下方式进行引导:
InputStream stream =
getClass().getClassLoader().getResourceAsStream("x/y/z/jgroups_udp.xml");
顺便说一句,如果您使用的是maven,那么您可以向pom.xml添加如下内容:
作为一种解决方法,您可以尝试通过命令行参数-Xboothclasspath/a:path添加需要使用的类路径,/a将path中的值附加到引导类路径。您需要将其作为命令行选项添加到实际的注释处理运行中,以便在Eclipse中:
右键单击project,选择properties、Java编译器、Annotation Processing,在表中单击New,然后添加key-Xbootclasspath/a和要添加为值的路径。恐怕我还没有在注释处理中尝试过,但值得一试 问题在于绑定到当前线程的类加载器。调用Processorprocess时,currentThread.getContextClassLoader不是URLClassLoader。它似乎是一个受限类加载器,不允许加载资源。javac、eclipse编译器、maven编译器等都会出现这种情况 幸运的是,您的处理器类将绑定一个合适的类加载器,即getClass.getClassLoader 问题是大多数实用程序都希望将正确的类加载器绑定到线程,最明显的是ServiceLoader和ResourceBundle 因此,有一个解决办法。处理器执行时,可以将类加载器重新绑定到当前线程:
@Override
public boolean process(
Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
//...
}
是的,似乎没有实施。有人找到解决办法吗?你们都解决了吗?我有一个类似的问题:比源位置更重要的是输出文件夹中的位置。您是否检查了文件是否也在output/META-INF/resource bundle中?你是如何建造的?您的输出文件夹是什么?加载捆绑包时指定的路径是什么?为什么不选择MyProject/src/main/java/my/package/MyInterfaces.java?我现在正面临这个问题,因为Eclipse中有一个处理器。我尝试了你的解决方法,但仍然找不到资源。你有别的选择吗?
@Override
public boolean process(
Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
//...
}