[英]Packaging WSDL clients in JARs with Maven and cxf-codegen-plugin
我有一個Maven項目,該項目將使用許多Web服務。 該應用程序將打包為WAR。 到目前為止,客戶端的代碼已使用cxf-codegen-plugin
在generate-sources
階段generate-sources
。 默認情況下,將生成的源放置在target/generated-sources/cxf
,並在compile
后將其編譯並與target/classes
的應用程序類混合。 生成的類和應用程序類都可以共享第一級包。
我希望將每個客戶端打包在WAR文件中WEB-INF/lib
中的其自己的JAR中。 我發現了有關-clientjar
,但它僅生成.jar
文件並將其放入target/generated-sources/cxf
,並且JAR最終也以target/classes
以及已編譯的類結尾,這毫無意義。
我想compile
插件有時會將生成的源代碼編譯到target/classes
,並且可能在另一個階段也將JAR移到那里。 是否有可能讓Maven避免編譯那些生成的源(或者甚至讓cxf-codegen-plugin
根本不生成cxf-codegen-plugin
,僅生成JAR),並針對CXF生成的JAR編譯應用程序類?
我知道可以通過為每個Web服務定義一個帶有jar包裝模塊的多模塊項目來實現此目的,但我想避免使用此選項。 可能會有大量的Web服務,因此不適合為每個服務維護一個獨立的模塊。 使用-clientjar
我已經被迫為每個WSDL定義一個<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工件並將其用作依賴項) )。
具體來說,對於每個WSDL,此方法都需要:
pom.xml
我最終創建了一個聚合器(多模塊)Maven項目,每個WebService Client有一個模塊,該項目將使用生成的WS客戶端類生成JAR工件(遵循每個POM的 Maven約定)。
為了方便起見,將在主pom.xml
只定義一次用於處理WebService客戶端類的插件,並且此POM是WS客戶端生成POM的父級。 重要的是要注意聚合器和父POM之間的差異。 這兩種方法一起使用。
主web應用程序還有一個模塊。 它的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
,並且對於每個WS客戶端工件都包含<dependency>
:
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.