这是我采取的方法。这不完全是我想要的,每个 WSDL 文件仍然有很多手动工作要做,并且与我想到的解决方案相去甚远(让 Maven 为项目中的每个 wsdl 自动创建单独的 JAR 工件并将它们用作依赖项)。
具体来说,对于每个 WSDL,这种方法需要:
- 创建一个包含 WSDL 文件的目录和一个
pom.xml
包含不同工件名称的目录
- 将该目录添加到顶级聚合器 POM。
- 在 webapp 的 POM 中添加对 WS 客户端 JAR 工件的依赖项。
我最终创建了一个聚合器(多模块)Maven 项目,每个 WebService 客户端都有一个模块,它将生成一个带有生成的 WS 客户端类的 JAR 工件(遵循 Maven 的每个 POM 一个工件的约定)。
为方便起见,负责 WebService 客户端类生成的插件仅在 main 中定义一次pom.xml
,并且此 POM 是 WS 客户端生成 POM 的父级。重要的是要注意聚合器和父 POM 之间的区别。在这种方法中,这两个概念一起使用。
还有一个用于主 webapp 的模块。它pom.xml
为每个 WS 客户端 JAR 工件指定依赖关系。
这是项目目录树的大纲:
| pom.xml
+-- WSClient1
| | WebService1.wsdl
| | pom.xml
+-- WSClientN
| | WebServiceN.wsdl
| | pom.xml
\---MyWebapp
| src
| pom.xml
聚合器 POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.myproject</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>Aggregator POM</name>
<properties>
<!-- CXF version used for cxf-codegen-plugin -->
<cxf.version>2.7.10</cxf.version>
</properties>
<modules>
<!-- WS Client Modules -->
<module>WSClient1</module>
<module>WSClientN</module>
<!-- WAR Module -->
<module>MyWebapp</module>
</modules>
<!-- Project configuration every child POM will inherit -->
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<!-- WSDL files will be at each project's root level -->
<wsdlRoot>.</wsdlRoot>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
每个 WS 客户端 POM 都非常简单,只是一个工件名称并指定父级:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.myproject</groupId>
<artifactId>wsclient1</artifactId>
<packaging>jar</packaging>
<version>1.0.0</version>
<name>WebService1 client</name>
<parent>
<groupId>com.example.myproject</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
</project>
webapp 的 POM 不需要是父 POM 的子项,因为它不会使用cxf-codegen-plugin
, 并且包含<dependency>
s 用于每个 WS 客户端工件:
<dependency>
<groupId>com.example.myproject</groupId>
<artifactId>wsclient1</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.example.myproject</groupId>
<artifactId>wsclientN</artifactId>
<version>1.0.0</version>
</dependency>