簡體   English   中英

使用Maven和cxf-codegen-plugin將JAR中的WSDL客戶端打包

[英]Packaging WSDL clients in JARs with Maven and cxf-codegen-plugin

我有一個Maven項目,該項目將使用許多Web服務。 該應用程序將打包為WAR。 到目前為止,客戶端的代碼已使用cxf-codegen-plugingenerate-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,此方法都需要:

  1. 創建一個包含WSDL文件的目錄和一個包含不同工件名稱的pom.xml
  2. 將該目錄添加到頂級聚合器POM中。
  3. 在Webapp的POM中向WS客戶端JAR工件添加依賴項。

我最終創建了一個聚合器(多模塊)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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM