2017-05-02 12 views
1

私はカスタムMavenプラグインを作成しています。そのMojosのいずれかで、私は、次のコード片を使用して、XMLファイルからXpp3Domオブジェクトを読んでいます:独自のMojoでmavenプラグインのディレクトリパスを取得します

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 
} 

私が読んでいたからXMLファイルを(plugins.xml)自体のプラグインのMavenのsrc/main/resourcesに格納されています。 私の質問はです。明示的にそのファイルへの絶対パスを明示せずにXMLファイルをどのように指していますか?

明確にする:このファイルを私のMavenプラグインのディレクトリの下に置いて欲しい。これは、Mavenプラグインの必要な部分であり、このプラグインを使用する他のMavenプロジェクトによって変更されるべきではないので、Mavenプラグインの外にあることはできません。

私は、Maven Mojoの変数/メソッドを検索しました。この変数は、Mavenプラグイン自体の絶対的な場所を指定します。私がそれを得たら、ちょうどvalue-of-that-variable/src/main/resources/plugins.xmlと位置を与えることができます。しかし、私はそのような変数を見つけることができません。私はまた、Maven PluginのプロパティをMojosの1つに渡して、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の使用を避けることができます。 –

関連する問題