如何使用注释处理器从src/main/resources读取文件?

Jor*_*orn 8 java annotation-processing

我有一个简单的注释处理器,需要从与注释类相同的项目中读取配置文件.结构示例:

- myproject 
  - src
    - main
      - java
        - my.package.SourceFile
      - resources
        - config.json
Run Code Online (Sandbox Code Playgroud)

在注释处理器中,我尝试读取文件:

FileObject resource = processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", "config.json");
Run Code Online (Sandbox Code Playgroud)

但它会抛出FileNotFoundException.我也尝试过其他路径,例如../resources/config.json(抛出Invalid relative name: ../resources/config.json).我尝试将配置文件放入src/main/java(甚至src/main/java/my/package),我不喜欢,但仍然会抛出FileNotFoundException.

如果我可以filer.getResource()告诉我它在哪里,它会有所帮助.为了找到答案,我尝试生成一个文件:

filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "dummy");
Run Code Online (Sandbox Code Playgroud)

产生于myproject/build/classes/main/dummy.不幸的是,我无法生成SOURCE_PATH,因此无法找到它.

Gun*_*nar 6

我希望在构建过程中(注释处理之前)将内容从中src/main/resources复制到target/classes。在这种情况下,您可以这样打开它们:

ProcessingEnvironment pe = ...;
FileObject fileObject = pe.getFiler()
    .getResource( StandardLocation.CLASS_OUTPUT, "", "config.json" );
InputStream jsonStream = fileObject.openInputStream();
Run Code Online (Sandbox Code Playgroud)

  • 在 Gradle 构建期间似乎不会将资源复制到输出类文件夹中。 (2认同)

Jor*_*orn 4

我和一位 Lombok 项目开发人员一起研究过这个问题。如果有人知道注释处理,那就是他们了;)

我们的结论是,JavacFileManager内部处理请求的方法没有解决路径StandardLocation.SOURCE_PATH。我们不确定,但这可能与使用 Gradle 构建有关。