7

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

4 回答 4

7

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

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

于 2009-05-05T22:55:41.957 回答
4

我有一个类似的问题,我希望子 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>
于 2009-06-26T16:11:25.217 回答
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>
...
于 2009-01-21T15:43:56.577 回答
0

这与您的其他问题有关

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

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

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

于 2009-01-21T17:43:12.560 回答