配置文件中的可选Maven属性

时间:2014-02-04 18:28:23

标签: maven

我有“web服务测试”项目,我用它来测试我们的Web服务。我使用maven配置文件为每个Web服务生成客户端,如下所示:

<profile>
    <!-- to run: mvn clean cxf-codegen:wsdl2java -e -Dservice=single-sign-on -->
    <id>single-sign-on</id>
    <activation>
        <property>
            <name>service</name>
            <value>single-sign-on</value>
        </property>
    </activation>
    <properties>
        <ws.wsdl>http://example.com:8080/SingleSignOnService?wsdl</ws.wsdl>
        <ws.dir>src/generated/single-sign-on</ws.dir>
        <ws.package>com.example.single_sign_on</ws.package>
    </properties>
</profile>

我使用cxf-codegen-plugin实际生成客户端:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <configuration>
        <sourceRoot>${ws.dir}</sourceRoot>
        <wsdlOptions>
            <wsdlOption>
                <wsdl>${ws.wsdl}</wsdl>
                <extraargs>
                    <extraarg>-impl</extraarg>
                    <extraarg>-verbose</extraarg>
                    <extraarg>-frontend</extraarg>
                    <extraarg>jaxws21</extraarg>
                    <extraarg>-xjc-npa</extraarg>
                    <extraarg>-p</extraarg>
                    <extraarg>${ws.package}</extraarg>
                </extraargs>
            </wsdlOption>
        </wsdlOptions>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.8.1</version>
        </dependency>
    </dependencies>
    <inherited>true</inherited>
</plugin>

问题是我需要为一些Web服务指定包,因此它们的对象不会发生冲突,但对于我不需要的大多数Web服务。所以基本上我想要做的就是选择性地包括

<extraarg>-p</extraarg>
<extraarg>${ws.package}</extraarg>

部分取决于配置文件是否具有&lt; ws.package&gt;属性是否定义。这可能吗?

1 个答案:

答案 0 :(得分:0)

我不确定这可以通过maven开箱即用,因为它只会合并<configuration>元素的第一级,以及您在配置文件中可能具有的任何其他配置(和从而替换整个<wsdlOptions>元素。

一个解决方案,但只是为了使当前状态给你带来足够的痛苦,就是编写自己的版本cxf-codegen-plugin,你可以在<myextraargs>的顶层传递额外的<config>配置。 1}}。例如

<profile>
    <id>single-sign-on</id>
    <activation>
        <property>
            <name>service</name>
            <value>single-sign-on</value>
        </property>
    </activation>
    <properties>
        <!-- ... -->
        <!-- extra args for your plugin -->
        <my.extra.args>-p ${ws.package}</my.extra.args>
    </properties>
</profile>

-

<!-- generic test configuration>
<plugin>
    <groupId>your.group.id</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <configuration>
        <sourceRoot>${ws.dir}</sourceRoot>
        <myextraargs>${my.extra.args}</myextraargs>
        <wsdlOptions>
            <wsdlOption>
                <wsdl>${ws.wsdl}</wsdl>
                <extraargs>
                    <extraarg>...</extraarg>
                </extraargs>
            </wsdlOption>
        </wsdlOptions>
    </configuration>
    <!-- ... -->
</plugin>

然后你的插件将负责合并真正的cfx插件所需的额外args数组。

修改

在写完答案之后,我想知道如果传递空<extraarg>元素,CFX插件是否会抱怨。如果没问题,那么您可以在配置文件中定义变量,而某些配置文件将具有空值,例如

<!-- profile 1 -->
    <properties>
        <!-- ... -->
        <cfx.extra.property.1>-p</cfx.extra.property.1>
        <cfx.extra.property.2>${ws.package}</cfx.extra.property.2>
    </properties>
<!-- profile 2 -->
    <properties>
        <!-- ... -->
        <cfx.extra.property.1></cfx.extra.property.1>
        <cfx.extra.property.2></cfx.extra.property.2>
    </properties>
<!-- ... -->
                <extraargs>
                    <extraarg>...</extraarg>
                    <extraarg>${cfx.extra.property.1}</extraarg>
                    <extraarg>${cfx.extra.property.2}</extraarg>
                </extraargs>