在自己的Mojo

时间:2017-05-02 21:38:25

标签: java maven maven-plugin

我正在创建一个自定义maven插件。在其中一个Mojos中,我正在使用以下代码段从XML文件中读取Xpp3Dom对象:

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插件POM传递给它的一个Mojos,以便我可以通过project.build.directory,但找不到方法。

要明确:我想在其中一个Mojos中访问maven插件目录下的文件。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分: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()阅读。