2016-09-29 4 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

나는 이것을 Project Lombok 개발자 중 한 명과 함께 보았습니다. 아무도 주석 처리를 알고 있다면, 그것들입니다.)

결론적으로 내부적으로 요청을 처리하는 JavacFileManagerStandardLocation.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();