2013-01-16 77 views
1

我目前正在使用Maven的jaxws-maven-plugin自動化Web服務客戶端生成的項目。目前,Web服務客戶端是使用用於Web服務客戶端生成的IBM RAD 8.0內部工具生成的。將wsimport綁定文件更改爲指向本地資源

這工作正常,但隨着Web服務數量的增加,這個過程變得太慢了。儘管我們可以讓Maven插件在客戶端項目中生成Java類,並在本地開發本地服務器時使用它們,但是當我們嘗試部署Web服務時,驗證Web服務失敗。 這是由於服務器基礎結構,當項目需要逐步完成測試,階段和生產服務器時,需要進一步部署,以便在每臺服務器上成功進行測試。

部署後,Websphere Portal Servr會嘗試根據包中生成的綁定Java文件中給出的WSDL定義來驗證生成的Web服務客戶端。當運行Maven插件,下面bindung產生:

MyProjectHttpService

static { 
    URL url = null; 
    WebServiceException e = null; 
    try { 
     url = new URL("http://localhost:9080/MyProjectWeb/sca/MyProjectExportWS?wsdl"); 
    } catch (MalformedURLException ex) { 
     e = new WebServiceException(ex); 
    } 

因爲生成的Web項目需要從同樣的EAR文件中的每個服務器上運行,我們無法改變的URL服務器之間的WSDL文件。

RAD的進口工具產生使用類加載器來獲取文件綁定文件:

MyProjectHttpService

static { 
    URL url = null; 
    try { 
     url = com.my.package.portal.MyProjectHttpService.class.getResource("/WEB-INF/wsdl/project/interfaces/MyProjectExport1.wsdl"); 
     if (url == null) throw new MalformedURLException("/WEB-INF/wsdl/project/interfaces/MyProjectExport1.wsdl does not exist in the module."); 
    } catch (MalformedURLException e) { 
     ... 
    } 

爲了找到我們儘量去爲自己編寫Maven插件的解決方案它會下載XSD和WSDL文件並將它們放入構建包中,以便它們可以用於隨後使用wsimport插件生成Web服務客戶端,但是使用它們而不是。然而,這不是successull爲好,因爲綁定文件會以絕對路徑產生:

static { 
    URL url = null; 
    WebServiceException e = null; 
    try { 
     url = new URL("file:/D:/mavenworkspace/testproject/target/META-INF/wsdl/com/my/package/portal/ws/interfaces/MyProjectExport1.wsdl"); 
    } catch (MalformedURLException ex) { 
     e = new WebServiceException(ex); 
    } 
    } 

對我們如何才能解決這個問題將受到歡迎任何幫助。我們並不關心如何實現將我們的jar中的所有XSD和WSDL文件相對引用的結果,因此,當Web服務器嘗試驗證Web服務客戶端時,環境並不重要。

PS:不幸的是,我們也無法爲不同環境使用多個配置文件。

回答

0

經過一番嘗試後,我終於能夠解決我們的問題。 http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.html

我們結束了與它結合了wsimport的插件的新Maven插件和使用定製的解決方案:我們通過我這篇文章(和它相連的那些)都走到正確的軌道。我們自己的插件通過下載給定URL的所有.wsdl和.xsd文件來完成一些初步工作。我沒有允許共享代碼,但我想給我們的插件是如何工作的一些提示,讓任何人在爲我們可以破解一個合適的插件同樣的情況;)

這是聚甲醛的生成部分這成爲我們的Web服務客戶端項目的文件:

<build> 
    <plugins> 
     <plugin> 
      <groupId>com.my.company</groupId> 
      <artifactId>wsdl-import</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>wsdlimport</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <wsdlUrls> 
        <wsdlUrl>http://serveraddress/MYWEBSERVICEMODULE/WEBSERVICe?wsdl</wsdlUrl> 
       </wsdlUrls> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.jvnet.jax-ws-commons</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <target>2.1</target> 
       <keep>true</keep> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>wsimport</goal> 
        </goals> 
        <configuration> 
         <wsdlLocation>/wsdl/com/my/company/WEBSERVICEEXPORT.wsdl</wsdlLocation> 
         <wsdlUrls> 
          <wsdlUrl>${project.build.directory}/META-INF/wsdl/com/my/company/WEBSERVICEEXPORT.wsdl</wsdlUrl> 
         </wsdlUrls> 
        </configuration> 
       </execution 
      </executions> 
     </plugin> 
    </plugins> 
    <resources> 
     <resource> 
      <directory>${project.build.directory}/META-INF/</directory> 
     </resource> 
    </resources> 
</build> 

我們的插件wsdlimport是建立類似的wsimport插件。它在標記中採用一組WSDL文件。下載每個wsdl文件並使用XPath解析生成的文檔。對於每個「xsd:import」或「xsd:include」元素的XML節點,都會提取模式位置的路徑並解析其他包含(其他)XSD文件的節點。你需要注意的事項有哪些引用不屬於簡單類型等元素節點:

<xsd:element maxOccurs="unbounded" minOccurs="0" name="persons" type="bons1:BOPerson"> 
<xsd:element maxOccurs="unbounded" minOccurs="0" name="names" type="xsd:string"> 

這種元素有另一個名字空間不是簡單的類型,這是在XSD命名。在我們的例子中,我們爲自己的BO定製了命名空間bons1和bons2(我猜BO-Namespace 1和2)。

插件被配置爲放置在目標目錄中的所有WSDL文件的文件夾「META-INF/WSDL/packagepath的/」

之後,正常的wsimport插件接管了: 我們定義爲指向路徑「/ wsdl/packagepath /」(如上所述,但沒有META-INF)。作爲wsdlUrl,我們提供了下載的WSDL文件的本地路徑。這產生了我們的java實現。

最後,爲了使下載和生成的文件起作用,您需要將META-INF文件夾定義爲資源,以便將其捆綁到輸出.jar文件中。通過定義META-INF文件夾,WSDL和XSD文件將與「/ wsdl」打包在.jar的根目錄中。這就是爲什麼我們將其定義爲「/ wsdl/packagepath/...」而不是「/ META-INF/wsdl/packagepath/...」。

我希望這有助於解決將來的類似問題。