Java 使用Maven和cxf codegen插件在JAR中打包WSDL客户端
我有一个maven项目,它将使用许多Web服务。该应用程序将打包为WAR。到目前为止,客户端的代码是在Java 使用Maven和cxf codegen插件在JAR中打包WSDL客户端,java,maven,cxf,webservice-client,cxf-codegen-plugin,Java,Maven,Cxf,Webservice Client,Cxf Codegen Plugin,我有一个maven项目,它将使用许多Web服务。该应用程序将打包为WAR。到目前为止,客户端的代码是在生成源代码阶段使用cxf codegen插件生成的。默认情况下,生成的源被放置在target/generated sources/cxf中,在compile之后,它们被编译并与target/classes中的应用程序类混合。生成的类和应用程序类都可以共享第一级包 我希望每个客户端都打包在WAR文件中自己的JAR中WEB-INF/lib。我发现了-clientjar,但它只生成.jar文件并将它们
生成源代码
阶段使用cxf codegen插件
生成的。默认情况下,生成的源被放置在target/generated sources/cxf
中,在compile
之后,它们被编译并与target/classes
中的应用程序类混合。生成的类和应用程序类都可以共享第一级包
我希望每个客户端都打包在WAR文件中自己的JAR中WEB-INF/lib
。我发现了-clientjar
,但它只生成.jar
文件并将它们放入目标/生成的源代码/cxf
,jar也会与编译的类一起进入目标/类
,这是毫无意义的
我假设compile
插件在某个时候正在将生成的源代码编译成target/classes
,可能另一个阶段也在将jar移动到那里。有没有可能让Maven避免编译那些生成的源代码(或者甚至让cxf codegen plugin
根本不生成源代码,只生成JAR),并根据cxf生成的JAR编译应用程序类
我知道通过为每个Web服务定义一个带有jar打包模块的多模块项目来实现这一点是可能的,但我希望避免使用此选项。可能存在大量Web服务,因此不适合为每个Web服务维护独立的模块。使用-clientjar
我已经被迫为每个WSDL定义一个
,以便为每个WSDL提供JAR名称(不可能让cxf codegen插件只扫描src/main/resources/WSDL
或
)
当然,客户机JAR可以在Maven外部生成并安装到本地存储库,并在项目中定义为依赖项,但我想知道是否可以在单个Maven构建中实现这一点
对于程序集,我可能会理清如何将-clientjar
生成的JAR文件放入WEB-INF/lib
中,但在WAR中生成的类仍然存在问题
我对Maven构建生命周期及其可能性没有深入的了解,任何建议或建议都是非常受欢迎的。这是我采用的方法。这并不是我想要的,对于每个WSDL文件,仍然有大量的手工工作要做,这与我所想到的解决方案相去甚远(让Maven为项目中的每个WSDL自动创建单独的JAR构件,并将它们用作依赖项)
具体而言,对于每个WSDL,此方法需要:
创建包含WSDL文件的目录和包含不同工件名称的pom.xml
将该目录添加到顶级聚合器POM
在webapp的POM中向WS-client-JAR工件添加依赖项
我最终创建了一个聚合器(multimultimodule)Maven项目,每个WebService客户机有一个模块,它将生成一个带有生成的WS客户机类的JAR工件(遵循Maven关于每个POM一个工件的约定)
为了方便起见,将负责WebService客户端类生成的插件只在主pom.xml
中定义了一次,并且该pom是WS-client生成pom的父级。重要的是要注意聚合器和父POM之间的差异。在这种方法中,这两个概念一起使用
还有一个用于主webapp的模块。它的pom.xml
指定了每个WS-client 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>
这就是我采取的方法。这并不是我想要的,对于每个WSDL文件,仍然有大量的手工工作要做,这与我所想到的解决方案相去甚远(让Maven为项目中的每个WSDL自动创建单独的JAR构件,并将它们用作依赖项)
具体而言,对于每个WSDL,此方法需要:
创建包含WSDL文件的目录和包含不同工件名称的pom.xml
将该目录添加到顶级聚合器POM
在webapp的POM中向WS-client-JAR工件添加依赖项
我最终创建了一个聚合器(multimultimodule)Maven项目,每个WebService客户机有一个模块,它将生成一个带有生成的WS客户机类的JAR工件(遵循Maven关于每个POM一个工件的约定)
为了方便起见,将负责WebService客户端类生成的插件只在主pom.xml
中定义了一次,并且该pom是WS-client生成pom的父级。重要的是要注意聚合器和父POM之间的差异。在这种方法中,这两个概念一起使用
还有一个用于主webapp的模块。它的pom.xml
指定了每个WS-client 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>
似乎在要求类似的东西。我最终创建了一个包含主项目和另一个聚合器以及父项目的聚合器,该聚合器和父项目将使其子项wsdl2java
每个wsdl
都位于子文件夹中的一个jar中。这不完全是我想要的,但效果很好(包括编写一个虚拟的pom.xml
文件来指定工件名称和groupId,并将其添加到父级的
中,以供每个新的WS客户端添加)。为什么不将解决方案作为答案而不是注释发布呢?回答很好。向上投票。似乎在要求类似的东西。我