2010-08-27 12 views
22

मुझे एक डब्ल्यूएस क्लाइंट उत्पन्न करना है और मैं तय करने के लिए प्लगइन तय नहीं कर सकता। अब तक मेरे विकल्प हैं: jaxb2-maven-plugin, axistools-maven-plugin और jaxws-maven-plugin।वेब सेवा क्लाइंट उत्पन्न करने के लिए सबसे अच्छा मैवेन प्लगइन कौन सा है?

+0

यहां http://stackoverflow.com/questions/2432859/difference-of-maven-jaxb-plugins यह कहता है कि maven-jaxb2-plugin लगातार विकसित और पसंदीदा है।आप maven-jaxb2-plugin का उपयोग क्यों नहीं कर सकते? – despot

उत्तर

31

I have to generate a WS Client and I can't decide wich plugin to use. Until now my options are: jaxb2-maven-plugin, axistools-maven-plugin and jaxws-maven-plugin.

पहले, jaxb2-maven-plugin वास्तव में WS ग्राहकों उत्पन्न करने के लिए इरादा नहीं है। सफाया कर दिया।

दूसरा, व्यक्तिगत रूप से I wouldn't use Axis even for client development only इसलिए मैं axistools-maven-plugin का उपयोग करने की अनुशंसा नहीं करूंगा। सफाया कर दिया।

यह हमें JAX-WS आरआई और अपाचे CXF साथ छोड़ देता है स्टैक्स, और उनके संबंधित Maven प्लगइन्स: JAX-WS Maven Plugincxf-codegen-plugin और (निर्देश JAX-WS Maven प्लगइन Usage पृष्ठ पर पाया जा सकता है का उपयोग करने के लिए)।

पक्ष-विपक्ष के बारे में, मैं उन्हें इस तरह संक्षेप में प्रस्तुत होगा:

  • JAX-WS आरआई जावा 6 में शामिल है, लेकिन प्रलेखन अधिक "किसी न किसी" है (हालांकि you'll find plenty of tutorials about JAX-WS RI too)।
  • अपाचे सीएक्सएफ बेहतर दस्तावेज है और यदि आप कल्पना से परे जाना चाहते हैं तो अधिक लचीलापन प्रदान करें।

अंत में, दोनों विकल्प सभ्य हैं इसलिए मैं लिंक को थोड़ा सा ब्राउज़ करने और अपनी राय बनाने का सुझाव देता हूं।

+1

[जेएक्स-डब्ल्यूएस मेवेन प्लगइन] (https://jax-ws-commons.java.net/jaxws-maven-plugin/) लिंक बदल गया। – Dormouse

+0

मेरा सुझाव है कि आप लिंक को अपडेट करने के लिए उत्तर संपादित करें। –

+0

चिंता मत करो दोस्तों मुझे मिल गया! – javajavajava

4

मैं jaxws-maven-plugin का उपयोग करता हूं। मेरी राय में, जेएक्स-डब्ल्यूएस डब्ल्यूएस के लिए डी-फैक्टो मानक कार्यान्वयन है। यह एक्सिस की तुलना में बहुत बेहतर जेनरेट कोड है, और कॉन्फ़िगर और कार्यान्वित करने में आसान है। इसमें मेवेन और स्प्रिंग का समर्थन है।

WSDL फ़ाइल से क्लाइंट-साइड कोड जनरेट कर रहा है, pom.xml में:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>generate-reports-ws-code</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>wsimport</goal> 
        </goals> 
        <configuration> 

<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution -->       <staleFile>${project.build.directory}/jaxws/stale/.staleFlag.reports</staleFile> 
         <packageName>com.acme.reports.ws.api</packageName> 
         <wsdlDirectory>${project.build.directory}/wsdl</wsdlDirectory> 
         <wsdlFiles> 
          <wsdlFile>InternalReportsAPIService.wsdl</wsdlFile> 
         </wsdlFiles> 
         <verbose>true</verbose> 
         <sourceDestDir>${wsdl.generated.source.files.dir}</sourceDestDir> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

(यह नहीं ऑटो उत्पन्न होता है) ग्राहक सेवा सेम बनाने के लिए एक इंटरफेस:

public interface InternalReportsAPIServiceFactory { 

    public InternalReportsAPIService createInternalReportsAPIService(); 

} 

इसके बीन कार्यान्वयन:

public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory { 

    private URL acmeReportsWsdlURL; 

    private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService"); 

    @Override 
    public InternalReportsAPIService createInternalReportsAPIService() { 
     return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME); 
    } 

    public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) { 
     try { 
      this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl); 
     } catch (MalformedURLException ex) { 
      throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex); 
     } 
    } 
} 

इस बीन (स्प्रिंग बीन के रूप में उपयोग) में विचार जेन के लिए सिंगलटन होना है क्लाइंट सेवा कोड मिटा रहा है। इसके लिए दो इनपुट की आवश्यकता है: डब्लूएसडीएल यूआरएल - यानी, सर्वर का वास्तविक यूआरएल जो डब्लूएसडीएल लागू करता है। ग्राहक सेवा कोड, निर्माण पर, आपूर्ति किए गए यूआरएल पर डब्ल्यूएसडीएल के लिए एक अनुरोध भेजें। इसके बाद यह ऑटो जेनरेट कोड में रहने वाले एनोटेशन के आधार पर डब्लूएसडीएल बनाता है, और इसकी तुलना इसकी तुलना करती है। मेरा मानना ​​है कि यह सुनिश्चित करने के लिए किया जाता है कि आप सही सर्वर संस्करण के खिलाफ चल रहे हैं। इसलिए, मैंने यूआरएल को मेरे आवेदन के लिए सुलभ संपत्ति फ़ाइल में रखा है, इस प्रकार मैं अपने स्प्रिंग एप्लिकेशन संदर्भ फ़ाइल में प्रारंभ करता हूं।

यहाँ कारखाने का उपयोग कर एक सेवा उत्पन्न करने के लिए और फिर इसे का उपयोग करने का एक उदाहरण है:

InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService(); 
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort(); 

यहाँ से, सिर्फ बंदरगाह चर का उपयोग wsdl पर किसी भी आपरेशन उपलब्ध कॉल करने के लिए।

+1

कामकाजी उदाहरण हमेशा अच्छे होते हैं। –

+1

अब जोड़ा गया। उम्मीद है कि यह –

+0

में मदद करता है यह मेरे लिए काम नहीं करता है। क्या आप अपने पोम के सभी पहलुओं को wsgen और wsimport धन्यवाद के बारे में बता सकते हैं। जिस तरह से यह 'मूल त्रुटि के बारे में शिकायत करता है: मेटाडाटा org.jvnet.staxex स्थानांतरित नहीं कर सका: stax-ex/maven-metadata.xml से/java.net (http://download.java.net/maven/1/): रिपॉजिटरी java.net ' –

संबंधित मुद्दे