【问题标题】:Get directory path of maven plugin in its own Mojo在自己的 Mojo 中获取 maven 插件的目录路径
【发布时间】:2017-09-30 13:17:54
【问题描述】:

我正在创建一个自定义的 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,但找不到方法。

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

任何建议都会有所帮助。

【问题讨论】:

    标签: java maven maven-plugin


    【解决方案1】:

    我认为读取某些插件自己的资源文件最简单的形式是通过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()

    【讨论】:

    • 成功了!我试过getClassLoader().getResource("fileName") 并直接使用Xpp3DomBuilder.build() 中的资源文件作为输入。但我收到一条错误消息,提示 absolute-path-to-plugin-jar/jarName!/fileName 不存在。但是,使用getResourceAsStream 并将其保存在使用OutputStream 的临时文件中并使用该文件有效。知道为什么直接使用它不起作用吗?
    • 为了向其他人澄清,Xpp3DomBuilder.build(input) 不起作用。输入需要是一个文件。
    • 为什么不能直接工作?我想您正在尝试使用 getResource 返回的 URL 创建一个 File,这是不兼容的类型。这就是为什么我建议你使用getResourceAsStream,它返回一个InputStream,这样你就可以避免使用File API。
    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2014-04-21
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多