2014-09-03 60 views
0

我有一個將使用大量web服務的maven項目。該應用程序將被打包爲WAR。到目前爲止,客戶的代碼已經生成cxf-codegen-plugin,在generate-sources階段。默認情況下,將生成的源文件放入target/generated-sources/cxf,並在compile之後將它們編譯並與target/classes中的應用程序類混合。生成的和應用程序類都可以共享一級包。使用Maven和cxf-codegen插件打包JAR中的WSDL客戶端

我希望每個客戶端都打包在WAR文件中的WEB-INF/lib之內的自己的JAR中。我發現大約-clientjar,但它只生成.jar文件並將它們放入target/generated-sources/cxf,並且JAR最終還會在target/classes以及編譯的類中,這是毫無意義的。

我猜想compile插件在某些時候正在編譯生成的源文件到target/classes,並且可能還有另一個階段也在移動JAR。是否有可能讓Maven避免編譯那些生成的源代碼(或者甚至根本不生成源代碼,只有JAR),並且針對CXF生成的JAR編譯應用程序類?

我知道有可能通過爲每個webservice定義一個帶有jar包模塊的multimodule項目來實現此目的,但是我想避免使用此選項。可能會有大量的Web服務,並且不適合爲每個服務維護一個獨立的模塊。由於-clientjar我已經被迫爲每個WSDL定義一個<wsdlOption>,以便爲每個WSDL提供JAR名稱(不可能讓cxf-codegen-plugin只掃描src/main/resources/wsdl<wsdlRoot>)。

當然,客戶端JAR可以在Maven之外生成並安裝到本地存儲庫,並且可以在項目中定義爲依賴關係,但是我想知道是否可以在單個Maven構建中執行此操作。

對於程序集,我可能會理清如何將-clientjar生成的JAR文件放置到WEB-INF/lib中,但WAR內生成的類仍然存在問題。

我對Maven構建生命週期及其可能性沒有深入的瞭解,任何建議或指針都非常受歡迎。

+0

[這個問題](http://stackoverflow.com/q/23338077/851811)似乎要求類似的東西。 – 2014-09-03 15:32:32

+0

我最終創建了一個包含主項目和另一個聚合器_and_父項目的聚合器,它將子項'wsdl2java'設置爲子項目文件夾中每個'wsdl'的一個jar。不完全是我想要的,但工作正常(涉及編寫一個虛擬的'pom.xml'文件來指定工件名稱和groupId並將其添加到每個要添加的每個新WS客戶端的'')。 – 2014-09-04 07:36:57

+0

爲什麼不將解決方案作爲答案而不是評論發佈? – alkis 2014-09-10 21:29:58

回答

4

這是我採取的方法。這不完全是我想要的,對於每個WSDL文件還有很多手動工作,並且遠離我想到的解決方案(讓Maven爲項目中的每個wsdl自動創建單獨的JAR構件並將它們用作依賴項)。

具體地,對於每個WSDL,這種方法需要:

  1. 創建包含WSDL文件目錄和pom.xml含有不同工件名稱
  2. 添加該目錄到頂級聚合POM。
  3. 向Web應用程序的POM中的WS客戶端JAR工件添加依賴項。

我結束了創建一個聚合器(多模塊)Maven項目,其每個WebService的客戶端一個模塊,將產生與生成的WS客戶端類(以下每一個神器Maven的約定JAR神器POM)。

爲方便起見,將在主要pom.xml中定義一個將處理WebService客戶端類生成的插件,並且此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>