根据其他属性值定义Maven中的属性

5
我想创建一个以下结构的Maven项目:
A
|--pom.xml
|--B
   |--pom.xml
|--C
   |--pom.xml

在这里,A、B和C都是文件夹,而B的pom.xml和C的pom.xml则是A的pom.xml的子项。我希望在B的pom.xml中加入以下内容:

<properties>
   <some.property>B</some.property>
</properties>

而在C语言中:

<properties>
   <some.property>C</some.property>
</properties>

我希望在A中定义一些属性的值,这些属性的值基于某个属性的值。例如,在伪代码中,A会执行以下操作:

if ( some.property == 'B') then
    some.other.property = 'some-value-based-on-b'
else if ( some.property == 'C') then
    some.other.property = 'some-value-based-on-c'
...

我想运行mvn clean install,参考A的pom.xml文件(其中包含指向B和C的模块部分),所以据我理解,我不能使用配置文件。因为在maven2项目中,运行在同一反应堆中的项目继承相同的活动配置文件。我可以使用maven3,但找不到它是否有所改变。
有人知道如何做吗?
谢谢。
1个回答

6

默认情况下,Maven 无法做到这一点,而且不鼓励使用解决方法(属性在生命周期内不应该改变)。

但是有几种解决方法,我最喜欢的是 gmaven 插件,它允许您 在 pom 文件中嵌入 Groovy 代码

以下代码片段将根据属性 'def' 是否包含 'foo' 将属性 'abc' 设置为 'bar' 或 'baz':

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source><![CDATA[pom.properties['abc']=
   pom.properties['def'].contains('foo') ? 'bar' : 'baz';
                ]]></source>
            </configuration>
        </execution>
    </executions>
</plugin>

顺便说一句,文档已经过时了,插件版本现在是1.3,groupId也已经更改。这里是当前版本


它并不完美,当我想使用它来导入一些由验证阶段定义的作用域变量所定义的依赖项时,它就出问题了。我猜测依赖项解析发生在这样的脚本有时间执行之前。 - Rafael
1
是的,我也这么认为。要实现这一点,您需要以编程方式迭代依赖项,并使用属性值替换占位符^shudder^。但是,您可以首先以编程方式创建依赖项。 - Sean Patrick Floyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接