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

时间:2009-01-21 15:36:52

标签: maven-2 maven-plugin findbugs

我在我的父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的<property name="name" location="${basedir}"/>

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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

然而,我所做的是在父级中创建一个变量,并在每个子Pom中覆盖相同的变量(这应该适用于大型poms ...虽然我没有任何)。

例如:

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>

答案 2 :(得分:0)

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

第一个想法

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

答案 3 :(得分:0)

这与your other question

有关

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

绝对路径的问题在于,在构建子项目时,您无法保证父项目的源将出现在计算机上。这就是拥有存储库机制的重点。

你有没有尝试过我的建议?