【问题标题】:Nested Maven properties evaluated in referring POM rather than defining POM在引用 POM 而不是定义 POM 时评估的嵌套 Maven 属性
【发布时间】: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;

【问题讨论】:

    标签: maven-2 maven-plugin findbugs


    【解决方案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有关。

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-29
        • 2012-07-15
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 2011-11-26
        相关资源
        最近更新 更多