2010-08-27 22 views
22

Tôi phải tạo một WS Client và tôi không thể quyết định sử dụng plugin nào. Cho đến bây giờ các tùy chọn của tôi là: jaxb2-maven-plugin, trình điều khiển axistools-maven-plugin và jaxws-maven-plugin.Plugin nào của maven tốt nhất để tạo ra một Máy khách dịch vụ Web?

+0

tại đây http://stackoverflow.com/questions/2432859/difference-of-maven-jaxb-plugins nó nói rằng maven-jaxb2-plugin không ngừng được phát triển và ưa thích.Tại sao bạn không thể sử dụng maven-jaxb2-plugin? – despot

Trả lời

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.

Thứ nhất, jaxb2-maven-plugin là không thực sự nhằm tạo ra khách hàng WS. Đã được tối ưu hóa.

Thứ hai, cá nhân I wouldn't use Axis even for client development only vì vậy tôi sẽ không khuyên bạn sử dụng axistools-maven-plugin. Đã được tối ưu hóa.

Điều này khiến chúng tôi có RAX JAX-WS và ngăn xếp Apache CXF và các plugin Maven tương ứng của chúng: JAX-WS Maven Plugin (hướng dẫn sử dụng JAX-WS Maven Plugin có thể được tìm thấy trên trang Usage) và cxf-codegen-plugin.

Về ưu và nhược điểm, tôi sẽ tóm tắt chúng như thế này:

  • JAX-WS RI được bao gồm trong Java 6, nhưng các tài liệu là nhiều hơn "thô" (mặc dù you'll find plenty of tutorials about JAX-WS RI too).
  • Apache CXF được tài liệu tốt hơn và cung cấp sự linh hoạt hơn nếu bạn muốn vượt ra ngoài thông số kỹ thuật.

Cuối cùng, cả hai lựa chọn đều tốt nên tôi khuyên bạn nên duyệt các liên kết một chút và đưa ra ý kiến ​​của riêng bạn.

+1

[JAX-WS Maven Plugin] (https://jax-ws-commons.java.net/jaxws-maven-plugin/) liên kết đã thay đổi. – Dormouse

+0

Tôi đề nghị bạn chỉnh sửa câu trả lời để cập nhật các liên kết. –

+0

Đừng lo lắng, tôi hiểu rồi! – javajavajava

4

Tôi sử dụng plugin jaxws-maven. Theo ý kiến ​​của tôi, JAX-WS là triển khai thực tế tiêu chuẩn cho WS. Nó có nhiều mã được tạo tốt hơn so với AXIS và dễ dàng hơn trong việc cấu hình và triển khai. Nó có hỗ trợ Maven và Spring.

Tạo client-side code từ file wsdl, trong 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> 

Một giao diện để tạo ra đậu dịch vụ khách hàng (điều này không tự động tạo ra):

public interface InternalReportsAPIServiceFactory { 

    public InternalReportsAPIService createInternalReportsAPIService(); 

} 

của Bean triển khai:

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); 
     } 
    } 
} 

Ý tưởng trong bean này (được sử dụng làm Spring bean) là có một singleton cho gen erating một mã dịch vụ khách hàng. Nó yêu cầu hai đầu vào: Url WSDL - tức là URL thực của máy chủ cài đặt WSDL. Mã dịch vụ khách hàng, khi xây dựng, gửi một yêu cầu lấy cho WSDL tại URL được cung cấp. Sau đó nó tạo WSDL dựa trên các chú thích nằm trong mã được tạo tự động và nó so sánh nó. Tôi tin rằng điều này được thực hiện để đảm bảo bạn đang chạy với phiên bản máy chủ chính xác. Vì vậy, tôi đã đặt url trong một tệp thuộc tính có thể truy cập vào ứng dụng của tôi, do đó tôi khởi tạo trong tệp ngữ cảnh ứng dụng Spring của mình.

Dưới đây là một ví dụ của việc sử dụng các nhà máy để tạo ra một dịch vụ và sau đó sử dụng nó:

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

Từ đây, chỉ cần sử dụng biến cảng để gọi bất kỳ hoạt động có sẵn trên wsdl.

+1

ví dụ làm việc luôn tốt đẹp. –

+1

Đã thêm ngay bây giờ. Hy vọng nó sẽ giúp –

+0

điều này đã không làm việc cho tôi. bạn có thể đặt tất cả các khía cạnh của pom của bạn liên quan đến wsgen và wsimport cảm ơn. theo cách nó phàn nàn về 'Lỗi gốc: Không thể chuyển siêu dữ liệu org.jvnet.staxex: stax-ex/maven-metadata.xml từ/sang java.net (http://download.java.net/maven/1/): Không có kết nối nào có sẵn để truy cập kho lưu trữ java.net' –

Các vấn đề liên quan