Какой плагин maven лучше всего подходит для создания клиента веб-службы?

Я должен создать клиент WS, и я не могу решить, какой плагин использовать. До сих пор мои варианты: jaxb2-maven-plugin, axistools-maven-plugin и jaxws-maven-plugin.

3 ответов


Я должен создать клиент WS, и я не могу решить, какой плагин использовать. До сих пор мои варианты: jaxb2-maven-plugin, axistools-maven-plugin и jaxws-maven-plugin.

сначала jaxb2-maven-plugin на самом деле не предназначен для создания клиентов WS. УСТРАНЕННЫЙ.

во-вторых, лично Я бы не использовал Axis даже для разработки клиента только поэтому я не рекомендую использовать axistools-maven-plugin. УСТРАНЕННЫЙ.

Это оставляет нас с JAX-WS RI и стеками Apache CXF и их соответствующими плагинами Maven:плагин JAX-WS Maven (инструкции по использованию плагина JAX-WS Maven можно найти на использование страницы) и в CXF-что codegen-плагин.

Что касается плюсов и минусов, я бы суммировал их следующим образом:

  • JAX-WS RI включен в Java 6, но документация более "грубая" (хотя вы найдете много учебников о JAX-WS RI тоже).
  • Apache CXF лучше документирован и обеспечивает большую гибкость, если вы хотите выйти за рамки спецификации.

В конце концов, оба варианта приличные, поэтому я предлагаю немного просмотреть ссылки и сделать свое собственное мнение.


Я использую jaxws-maven-плагин. На мой взгляд, JAX-WS является де-факто стандартной реализацией для WS. Он имеет гораздо лучший сгенерированный код, чем AXIS, и проще в настройке и реализации. Он имеет поддержку Maven и весны.

создание кода на стороне клиента из файла 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();

}

его реализация Bean:

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

идея в этом Бобе (используется как Spring bean) должен иметь синглтон для генерации кода клиентской службы. Для этого требуется два входа: url WSDL-то есть фактический URL сервера, который реализует WSDL. Код клиентской службы при построении отправляет запрос get для WSDL по предоставленному URL-адресу. Затем он создает WSDL на основе аннотаций, находящихся в автоматически сгенерированном коде, и сравнивает его. Я считаю, что это сделано, чтобы убедиться, что вы работаете с правильной версией сервера. Итак, я разместил url-адрес в файле свойств, доступном моему приложению, поэтому я инициализирую в файле контекста приложения Spring.

вот пример использования фабрики для создания службы, а затем ее использования:

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

отсюда просто используйте переменную port для вызова любой операции, доступной на wsdl.


требуются Плагины Maven:

  • cxf-java2ws-плагин (JAX-WS для WSDL)
  • CXF-codegen-плагин (WSDL для Java)

JAX-WS для WSDL Чтобы создать документ WSDL из аннотированного класса JAX-WS, настроив CXF-java2ws-plugin с целью "java2ws".

добавьте зависимости CXF-rt-frontend-jaxws и зависимости проекта, необходимые для аннотированного класса JAX-WS в качестве зависимостей плагинов.

<plugin>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-java2ws-plugin</artifactId>
   <version>2.5.1</version>
   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>2.5.1</version>
      </dependency>
      <dependency>
         <groupId>com.medici.app</groupId>
         <artifactId>services</artifactId>
         <version>0.0.1-SNAPSHOT</version>
      </dependency>
   </dependencies>
   <executions>
      <execution>
         <id>generate-sources</id>
         <phase>generate-sources</phase>
         <configuration>
            <className>com.medici.app.services.WebServiceBean</className>
            <genWsdl>true</genWsdl>
         </configuration>
         <goals>
            <goal>java2ws</goal>
         </goals>
      </execution>
   </executions>
</plugin>

WSDL 2 Java К создайте клиент Java из документа WSDL, настроив CXF-codegen-plugin с целью "wsdl2java".

аргумент ‘-p’ указывает классы пакетов .

созданные классы будут помещены в папку target/generated-sources/cxf.

<plugin>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-codegen-plugin</artifactId>
   <version>2.5.1</version>
   <executions>
      <execution>
         <id>process-sources</id>
         <phase>generate-sources</phase>
         <configuration>
            <wsdlOptions>
               <wsdlOption>
                  <wsdl>${project.build.directory}/wsdl/WebService.wsdl</wsdl>
                  <extraargs>
                     <extraarg>-p</extraarg>
                     <extraarg>com.medici.app.client.model</extraarg>
                  </extraargs>
               </wsdlOption>
            </wsdlOptions>
         </configuration>
         <goals>
            <goal>wsdl2java</goal>
         </goals>
      </execution>
   </executions>
</plugin>