我有“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;属性是否定义。这可能吗?
答案 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>