2017-05-02 1 views
1

커스텀 메이븐 플러그인을 만들고 있습니다. 그 Mojos 중 하나, 나는 다음과 같은 코드 조각을 사용하여 XML 파일에서 Xpp3Dom 객체를 읽고있다 :자체 Mojo에서 메이븐 플러그인의 디렉토리 경로를 가져옵니다.

File pluginsFile = new File(
     "absolute-path-to-file/plugins.xml"); 
Xpp3Dom Xpp3DomObject = new Xpp3Dom("plugins"); 
try { 
    FileReader reader = new FileReader(pluginsFile); 
    Xpp3DomObject = Xpp3DomBuilder.build(reader); 
    reader.close(); 
} catch (Exception e) { 
    // TODO throw exception 
} 

자체를 플러그인 받는다는의 src/main/resources에 저장되어있는 내가 읽고있다있는 XML 파일 (plugins.xml을). 내 질문은입니다. 명시 적으로 해당 파일의 절대 경로를 명시하지 않고 XML 파일을 가리키는 방법은 무엇입니까?

명확해야 :이 파일을 내 Maven 플러그인 디렉토리 아래에 놓고 싶습니다. 그것은 Maven 플러그인의 필수 부분이며이 Plugin을 사용하는 다른 Maven 프로젝트에 의해 변경되어서는 안되기 때문에 Maven 플러그인 외부에있을 수 없습니다.

필자는 Maven Mojo에서 maven 플러그인 자체의 절대 위치를 알려주는 변수/메소드를 검색했습니다. 그걸 얻으면 그 위치를 value-of-that-variable/src/main/resources/plugins.xml으로 줄 수 있습니다. 그러나 그러한 변수를 찾을 수 없습니다. 또한 Maven 플러그인 POM의 속성을 모조 스 중 하나로 전달하여 project.build.directory을 전달할 수있는 방법을 찾으려고했지만 길을 찾을 수 없습니다.

명확해야 함 : Maven 플러그인 디렉토리 아래 Mojos에있는 파일에 액세스하고 싶습니다.

어떤 제안 사항이 도움이 될 것입니다.

답변

2

플러그인의 리소스 파일 중 일부를 읽는 것이 가장 쉬운 방법은 getResourceAsStream() API를 사용하는 것입니다. 플러그인이 JAR로 제공되고 src 디렉토리가 사라지기 때문에 클래스 패스 자원 :

try (InputStream input=getClass().getClassLoader().getResourceAsStream("plugins.xml")){ 
    try(Reader reader=new InputStreamReader(input)); 
    { 
     Xpp3Dom Xpp3DomObject = Xpp3DomBuilder.build(input); 
    } catch (Exception e) { 
     ... 
    } 
} 

어쨌든, 이런 식으로 클래스 패스의 다른 JAR가 우연히 plugins.xml 파일을 포함해야하는 위험이 있습니다. 이러한 위험을 회피 (또는 적어도 감소), 당신은 패키지이해야

src\ 
    main\ 
     resources\ 
      foo\ 
       bar\ 
        MyMojo.java 
        plugins.xml 

...이 경우, 당신은 getClass().getResourceAsInputStream()를 통해 읽어야합니다.

+0

이렇게했습니다. 나는'getClassLoader(). getResource ("fileName")'을 시도하고'Xpp3DomBuilder.build()'에서 그 리소스 파일을 입력으로 직접 사용했다. 하지만'absolute-path-to-plugin-jar/jarName!/fileName'이 존재하지 않는다는 오류가 있습니다. 그러나'getResourceAsStream'을 사용하고'OutputStream'을 사용하여 임시 파일에 저장하고 그 파일을 사용했습니다. 직접 사용하지 않은 이유는 무엇입니까? –

+0

다른 사람을 위해 명확하게하기 위해'Xpp3DomBuilder.build (input)'는 작동하지 않습니다. 입력은 파일이어야합니다. –

+1

왜 직접 작동하지 않았습니까? 나는 당신이'getResource'에 의해 반환 된 URL을 사용하여'File'을 생성하려한다고 가정합니다. 이것은 호환되지 않는 타입입니다. 그래서'InputStream'을 반환하는'getResourceAsStream'을 사용하도록 권장했기 때문에'File' API를 사용하지 않아도됩니다. –

관련 문제