Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法加载批注处理器中的资源(不在类路径上)_Java_Eclipse_Annotation Processing - Fatal编程技术网

Java 无法加载批注处理器中的资源(不在类路径上)

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 如何使该项目的源或类路径可供处理器使用,以便加载属性文件 现在我只

我有一个注释处理器,它将使用接口的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目录中的所有文件,这让您知道它们已正确复制到类路径中

# 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());
    //...
}