我对多模块项目中的属性有疑问。
考虑以下3级项目结构:
project
+- pom.xml (packaging: pom) //referred to as super-pom
+- module_group
+- pom.xml (packaging: pom) //referred to as group-pom
+- module
+-pom.xml (packaging: jar) //referred to as module-pom
在super-pom中我定义了一个属性 revision ,它获取默认值“unknown”。
此外,我声明并使用配置为获取svn修订版的buildnumber-maven-plugin
并将其放入属性 revision 。
接下来,我将maven-jar-plugin
配置为将该属性写入清单。
在模块-pom中,我宣布使用buildnumber-maven-plugin
,以便实际执行。
这一切都在直接构建模块时起作用,即仅执行模块pom。
清单包含由控制台中打印的buildnumber-maven-plugin
报告的修订版。
但是,如果我执行super-pom或group-pom, revision 的默认值将写入清单,尽管buildnumber-maven-plugin
会被执行并且它会检索正确的版本(它会在运行maven-jar-plugin
之前将其打印到控制台。
所以我觉得我在多模块项目中缺少关于属性继承的东西。
有没有人知道这里有什么问题?或者任何人都可以指出我在这些情况下如何实际处理属性的描述(遗憾的是我还没有找到好的描述)?
更新
我做了一些研究和一些带有调试输出(-X
选项)的测试运行,从我到目前为止发现的,我认为我的问题如下:
1)在pom解析期间,pom中使用的属性将替换为它们的值。
考虑这个部分pom:
<!-- declare the property default value -->
<properties>
<revision>default</revision>
</properties>
...
<!-- use the property -->
<someconfig>${revision}</someconfig>
评估pom之后,它似乎会导致与此对应的状态:
<properties>
<revision>default</revision>
</properties>
...
<!-- The property seems to be "statically" replaced -->
<someconfig>default</someconfig>
2)即使在validate
阶段,设置实际属性值的插件也会在之后运行。
因此,属性本身已正确设置为新值,但不再读取它。
3)使用<someconfig>
的插件(在我的情况下,它将是maven-jar-plugin
)现在与<someconfig>default</someconfig>
一起运行,因此它根本不会读取revision
有人可以证实吗?
答案 0 :(得分:0)
我只能说在一个超级pom中声明buildnumber-maven-plugin和maven-jar-plugin对我来说很有用,无论它是组构建还是目标构建。
这是这个超级pom的一部分(所有项目的父级):
<!-- Generate build number -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>false</doUpdate>
</configuration>
</plugin>
<!-- Attach build number to all jars -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Build>${buildNumber}</Implementation-Build>
<Implementation-Build-Timestamp>${maven.build.timestamp}</Implementation-Build-Timestamp>
</manifestEntries>
</archive>
</configuration>
</plugin>