在引用 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 的<property name="name" location="$basedir"/>
。
【问题讨论】:
【参考方案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 属性的主要内容,如果未能解决你的问题,请参考以下文章
Netbeans 使用 pom.xml (Maven) 而不是 build.gradle (Gradle)