2011-02-23 60 views
3

我正在使用我從供應商處獲得的wsdl的實現。我們的項目運行在Spring和CXF上,我想創建一個jar讓我可以訪問這個供應商的wsdl服務,但是我遇到了類路徑問題。用CXF與jar捆綁wsdl wsdl2java

利用CXF的WSDL2Java的我能夠生成代碼,就像這樣:

WSDL_LOCATION = new URL("file:SomeService.wsdl"); 

的服務需要的WSDL是在classpath中,但我想將其捆綁在罐子以便它可作爲獨立的jar分發。使用wsdl2java工具,我可以在URL實例化中指定任何我想要的字符串。但是,我還沒有在jar中找到自定義字符串和wsdl文件位置的組合。

我得到這個工作,我想唯一的辦法就是把WSDL文件,該SomeService.class是相同的文件夾,使用下面的行:

WSDL_LOCATION = TrackService.class.getResource("TrackService_v4.wsdl"); 

然而,這有我不得不手動編輯java代碼並自己編譯它。這是不可取的,因爲我們最終希望將這個過程作爲我們的maven構建的一部分,並讓wsdl2java自動生成和編譯。

我確定wsdl在jar中的任何位置,但我不知道要傳入wsdl2java以使其引用jar中的文件。

有沒有人有任何建議或經驗這樣做?

回答

3

您需要按照以下步驟生成使用類加載器加載這個WSDL作爲類路徑資源存根指定類路徑WSDL位置:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>2.4.3</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-bindings-soap</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <sourceRoot>${project.build.directory}/generated-sources/cxf 
       </sourceRoot> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>${basedir}/yourWSDL.wsdl</wsdl> 
         <extraargs> 
          <extraarg>**-wsdlLocation**</extraarg> 
          <extraarg>**classpath:yourWSDL.wsdl**</extraarg> 
         </extraargs> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
+0

這是有道理的。我不再積極地在需要此功能的項目上工作,但我會接受您的答案,因爲它似乎可以合理解決問題。謝謝! – 2013-01-31 18:08:06

2

我遇到了同樣的問題 - 我有以下解決方法,但我仍然在尋找更清潔的東西。

  1. 請的src /主/資源/ WSDL您的WSDL

  2. 執行以下操作當您創建TrackService:

    URL WSDLURL = TrackService.class.getResource(「/ WSDL/TrackService_v4 .wsdl「); TrackService service = new TrackService(wsdlUrl);

理想的解決辦法是通過位置作爲<wsdlLocation/>元件到CXF WSDL2Java的插件。然後你的客戶端代碼可以調用默認的構造函數。但是,生成的存根代碼不允許您指定位於類路徑上的wsdl文件。

+0

對於我來說,理想的解決方案將是一個人在使用JAR我作出這樣的規定了WSDL存​​根不會有知道的嗎關於WSDL文件。我同意你的解決方法(這與我在文章中提到的相同),但我不想在JAR之外指定任何有關.wsdl文件的內容。 – 2011-02-27 23:19:27

+0

這給出了你需要打包wsdl文件的原因-http://jax-ws.java.net/faq/index.html#wsdl_at_runtime。至少他們正在考慮在將來讓它更清潔一些。 – mtpettyp 2011-02-28 02:11:55

2

The CXF Documentation解決它以同樣的方式:

URL wsdl = getClass().getResource("wsdl/greeting.wsdl"); 
SOAPService service = new SOAPService(wsdl, serviceName); 

提供的另一個選項是JaxWsProxyFactoryBean:

JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean(); 
proxyFactory.setServiceClass(MyService.class); 
proxyFactory.setWsdlLocation("/wsdl/MyService.wsdl"); 

如果您還需要調整端點URL,那麼你可以添加:

proxyFactory.setAddress("http://192.168.0.2:6666/");