我有一个 Maven 项目,它将使用许多 Web 服务。该应用程序将打包为 WAR。到目前为止,客户的代码已生成 cxf-codegen-plugin
,在 generate-sources
阶段。默认情况下,生成的源放置在 target/generated-sources/cxf
中,以及 compile
之后,它们被编译并与 target/classes
中的应用程序类混合。 。生成的类和应用程序类都可以共享一级包。
我希望每个客户端都打包在 WEB-INF/lib
内自己的 JAR 中在 WAR 文件中。我发现了-clientjar
,但它只生成 .jar
文件并将它们放入 target/generated-sources/cxf
,JAR 也最终出现在 target/classes
中。与编译的类一起,这是没有意义的。
我想compile
插件有时会将生成的源代码编译为 target/classes
,并且可能另一个阶段也在将 JAR 移至那里。是否可以让 Maven 避免编译这些生成的源(或者甚至让 cxf-codegen-plugin
根本不生成源,只生成 JAR),并根据 CXF 生成的 JAR 编译应用程序类?
我知道可以通过为每个 Web 服务定义一个带有 jar 打包模块的多模块项目来实现此目的,但我想避免使用此选项。可能有大量的 Web 服务,为每个服务维护一个独立的模块是不合适的。与-clientjar
我已经被迫定义 <wsdlOption>
为每个 WSDL 提供 JAR 名称(不可能让 cxf-codegen-plugin
只扫描 src/main/resources/wsdl
或 <wsdlRoot>
)。
当然,客户端 JAR 可以在 Maven 外部生成并安装到本地存储库,并定义为项目中的依赖项,但我想知道是否可以在单个 Maven 构建中执行此操作。
对于程序集,我可能会弄清楚如何放置 -clientjar
生成的 JAR 文件。进入WEB-INF/lib
但 WAR 中生成的类仍然存在问题。
我对 Maven 构建生命周期及其可能性没有深入的了解,非常欢迎任何建议或指示。
最佳答案
这就是我采取的方法。这并不完全是我想要的,每个 WSDL 文件仍然需要大量手动工作,并且与我想到的解决方案相去甚远(让 Maven 自动为项目中的每个 wsdl 创建单独的 JAR Artifact 并将它们用作依赖项) )。
具体来说,对于每个 WSDL,此方法需要:
- 创建一个包含 WSDL 文件和
pom.xml
的目录包含不同的 Artifact 名称 - 将该目录添加到顶级聚合器 POM。
- 在网络应用的 POM 中添加对 WS 客户端 JAR Artifact 的依赖项。
我最终创建了一个聚合器(多模块)Maven 项目,每个 WebService 客户端都有一个模块,它将使用生成的 WS 客户端类生成一个 JAR Artifact (遵循 Maven 的约定:每个 POM 一个 Artifact )。
为了方便起见,负责 WebService 客户端类生成的插件仅在主 pom.xml
中定义一次。 ,并且此 POM 是 WS 客户端生成 POM 的父级。请务必注意聚合器和父 POM 之间的区别。在这种方法中,这两个概念一起使用。
还有一个用于主网络应用程序的模块。它的pom.xml
指定每个 WS 客户端 JAR Artifact 的依赖关系。
这是项目目录树的轮廓:
| 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 都非常简单,只是一个 Artifact 名称并指定父级:
<?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>
Web 应用程序的 POM 不需要是父 POM 的子项,因为它不会使用 cxf-codegen-plugin
,并包括<dependency>
每个 WS 客户端 Artifact 的 s:
<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>
关于java - 使用 Maven 和 cxf-codegen-plugin 将 WSDL 客户端打包在 JAR 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648248/