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

Maven 2 在引用POM而不是定义POM时评估嵌套Maven属性,maven-2,maven-plugin,findbugs,Maven 2,Maven Plugin,Findbugs,我在父pom中定义了一个报告配置,它将在每个子项目和孙子项目中运行 像这样: <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <ve

我在父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>

org.codehaus.mojo
findbugs maven插件
1.2
真的
低
分钟
${basedir}/findbugsFilter.xml

问题在于每个子级都插入其
basedir
,而不是定义POM。我想我正在寻找与ANT的

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

第一个想法

在父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>

${basedir}
...
org.codehaus.mojo
findbugs maven插件
1.2
真的
低
分钟
${parent basedir}/findbugsFilter.xml
第二个想法

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

...
<includeFilterFile>${project.parent.basedir}/findbugsFilter.xml</includeFilterFile>
...
。。。
${project.parent.basedir}/findbugsFilter.xml
...
这与

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

绝对路径的问题在于,您无法保证在生成子项目时父项目的源将出现在计算机上。这就是拥有存储库机制的全部意义


你试过我对你的另一个问题的建议了吗?

简短的版本:你的问题的解决方案如中所述。您只需为包含
findbugsFilter.xml
的构建配置创建一个单独的(顶级)项目,并将该项目作为依赖项引用


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

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

然而,我所做的是在父级中创建一个变量,并在每个子Pom中重写相同的变量(这也适用于大Pom…尽管我没有任何变量)

例如:

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


Child POMs:
    <properties>
        <my_basedir>${basedir}/../</my_basedir>
    </properties>
父POM:
${basedir}
儿童POM:
${basedir}//
现在我只需在父级中列出一次筛选器,其他所有人都会得到它。如果移动子对象,只需更改相对路径

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

${my_basedir}/myfile.properties

我已经尝试了第一种。它也不起作用。第二,在孙子项目中不起作用。我刚刚尝试在我们的项目中实现这一点,但是似乎构建扩展引用的“构建工具”项目必须已经存在于存储库中,并且不能动态构建。