2016-09-29 45 views
4

我有一個簡單的註釋處理器,需要從註釋類的相同項目讀取配置文件。示例結構:如何使用註釋處理器從src/main/resources讀取文件?

- myproject 
    - src 
    - main 
     - java 
     - my.package.SourceFile 
     - resources 
     - config.json 

在標註處理,我試圖讀取文件:

FileObject resource = processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", "config.json"); 

但它拋出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"); 

它生成在myproject/build/classes/main/dummy。遺憾的是,我無法在SOURCE_PATH中生成,因此無法找到答案。

+0

我不知道你正在使用的API,但是如果它以源路徑爲基礎,那會解析爲'main/java/my/package/config.json',所以用'..'上去一次就不夠了。您可以嘗試將資源放在與源文件相同的包中。即'main/resources/my/package/config.json'。 –

+0

我不知道爲什麼源路徑將類作爲基地的位置。在閱讀配置文件時,沒有任何地方提及類位置。它沒有。我期望它採用'src/main/java',但顯然這不是它所做的。 我曾嘗試將資源放在與源文件相同的位置,但它在那裏也找不到。 – Jorn

+0

好吧,我想也許它把'SOURCE_PATH'作爲當前正在處理的源文件的路徑。 –

回答

1

我已經看到了與龍目島開發項目之一。如果有人知道註釋處理,就是他們;)

我們的結論是,內部處理請求的JavacFileManager沒有解決StandardLocation.SOURCE_PATH的路徑。我們不確定,但它可能與使用Gradle構建相關。

1

我期望src/main/resources的東西在構建期間(在註解處理之前)被複制到target/classes。在這種情況下,你可以像這樣打開它們:

ProcessingEnvironment pe = ...; 
FileObject fileObject = pe.getFiler() 
    .getResource(StandardLocation.CLASS_OUTPUT, "", "config.json"); 
InputStream jsonStream = fileObject.openInputStream(); 
相關問題