在引用 POM 而不是定义 POM 时评估的嵌套 Maven 属性

Posted

技术标签:

【中文标题】在引用 POM 而不是定义 POM 时评估的嵌套 Maven 属性【英文标题】:Nested Maven properties evaluated in referring POM rather than defining POM 【发布时间】:2009-01-21 15:36:51 【问题描述】:

我在我的父 pom 中定义了一个报告配置,它将在每个子项目和孙项目中运行。

像这样:

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <xmlOutput>true</xmlOutput>
                <threshold>Low</threshold>
                <effort>Min</effort>
                <includeFilterFile>$basedir/findbugsFilter.xml</includeFilterFile>
            </configuration>
        </plugin>
    </plugins>
</reporting>

问题是每个孩子都插入了它的basedir,而不是定义的POM。我想我正在寻找相当于 ANT 的&lt;property name="name" location="$basedir"/&gt;

【问题讨论】:

【参考方案1】:

简短版:documentation of the findbugs-maven-plugin 中描述了您的问题的解决方案。您只需为包含您的 findbugsFilter.xml 的构建配置创建一个单独的(***)项目,并将该项目作为依赖项引用。

长版本:不幸的是,在 Maven 中从父项目或兄弟项目访问资源有点复杂。原因:在构建子项目时,Maven 不能假定父模块在文件系统中的上一级或兄弟项目在同一级别。事实上,它不能假设这些项目中的任何一个都已在某个地方签出!只签出一个子项目并按原样构建它是完全合法的。因此,当使用 Maven 构建时,所有内容(很少有例外)都是从本地存储库加载的。这就是为什么您必须为要在多个模块中使用的资源创建单独的项目。然后可以将单独的项目添加为依赖项,并由一堆不同的 Maven 插件使用。例如:checkstyle 和 findbugs 插件用于读取配置文件,maven-dependency-plugin 用于将外部文件复制到您的工件中或properties-maven-plugin 用于加载外部属性文件。

【讨论】:

我刚刚尝试在我们的项目中实现这一点,但是似乎构建扩展引用的“构建工具”项目必须已经存在于存储库中,并且无法构建在飞行中。【参考方案2】:

我有一个类似的问题,我希望子 POM 具有与父 POM 相同的属性文件,但我无法使 $project.parent.basedir 变量工作。

但是我所做的是在父级中创建一个变量,并在每个子级 Pom 中覆盖相同的变量(这也适用于 Grand-pom...虽然我没有任何变量)。

例如:

Parent POM:
    <properties>
        <my_basedir>$basedir</my_basedir>
    </properties>


Child POMs:
    <properties>
        <my_basedir>$basedir/../</my_basedir>
    </properties>

现在我只在父级中列出过滤器一次,其他人都会得到它。如果你移动孩子,你只是改变了相对路径。

   <filters>
       <filter>$my_basedir/myfile.properties</filter>
   </filters>

【讨论】:

【参考方案3】:

我不确定这是否能解决您的问题,但我有两个想法可以尝试:

第一个想法

在父pom中定义一个属性,并在报表配置中使用:

<properties>
    <parent-basedir>$basedir</parent-basedir>
</properties>
...
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <xmlOutput>true</xmlOutput>
                <threshold>Low</threshold>
                <effort>Min</effort>
                <includeFilterFile>$parent-basedir/findbugsFilter.xml</includeFilterFile>
            </configuration>
        </plugin>
    </plugins>
</reporting>

第二个想法

另一个想法是使用$project.parent.basedir:

...
<includeFilterFile>$project.parent.basedir/findbugsFilter.xml</includeFilterFile>
...

【讨论】:

我尝试了第一个。它也没有用。第二个,在孙子项目中不起作用。【参考方案4】:

这与your other question有关。

您是否放弃了将过滤器文件部署在单独的工件中的想法?为什么?

绝对路径的问题在于,当您构建子项目时,您无法保证父项目的源代码会出现在机器上。这就是拥有存储库机制的全部意义所在。

您是否尝试过我对您其他问题的建议?

【讨论】:

以上是关于在引用 POM 而不是定义 POM 时评估的嵌套 Maven 属性的主要内容,如果未能解决你的问题,请参考以下文章

nameof() 是在编译时评估的吗?

将父 POM 折叠到子中

没有版本的jar包怎么在maven 里的pom配置

Netbeans 使用 pom.xml (Maven) 而不是 build.gradle (Gradle)

Maven 发布插件 - 准备创建快照版本而不是发布版本的标签

什么时候更新你的 pom 中的主要版本而不是次要版本?