多模块项目中的 Maven 属性重置为默认值
Posted
技术标签:
【中文标题】多模块项目中的 Maven 属性重置为默认值【英文标题】:Maven properties in multi-module project are reset to default 【发布时间】:2011-11-27 13:55:21 【问题描述】:我对多模块项目中的属性有疑问。
考虑以下 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
在超级 pom 中,我定义了一个属性 revision,它获取默认值“未知”。
另外,我声明并使用buildnumber-maven-plugin
,它被配置为获取 svn 修订版并将其放入属性 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
。
谁能证实这一点?
【问题讨论】:
【参考方案1】:我只能说在 super-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>
【讨论】:
以上是关于多模块项目中的 Maven 属性重置为默认值的主要内容,如果未能解决你的问题,请参考以下文章