Используйте Maven для запуска wsgen & wsimport подряд, используя wsdlLocation - PullRequest
13 голосов
/ 29 января 2010

Мне трудно использовать maven для создания моего клиента. Поэтому, пожалуйста, обратитесь к Создание клиента веб-сервиса непосредственно из источника для первой части моего вопроса.

Для простоты и краткости я хочу перейти отсюда (файл в src / main / java):

   package com.example.maven.jaxws.helloservice;
   import javax.jws.WebService;
   @WebService
   public class Hello {
     public String sayHello(String param) {
     ;  return "Hello " + param;
     }
   } 

туда:

/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.7-b01-
 * Generated source version: 2.1
 * 
 */
@WebServiceClient(name = "HelloService", targetNamespace = "http://helloservice.jaxws.maven.example.com/", wsdlLocation = "http://localhost:8080/test/")
public class HelloService
    extends Service
{

    private final static URL HELLOSERVICE_WSDL_LOCATION;
    private final static Logger logger = Logger.getLogger(com.example.wsimport.HelloService.class.getName());
    ...etc

используя только 1 файл pom.xml.

Обратите внимание, что wsdlLocation установлен в конце. Файл pom.xml, вероятно, будет использовать оба maven-jaxws-plugin wsgen И wsimport с некоторой сложной конфигурацией для достижения этой цели.

Ответы [ 3 ]

17 голосов
/ 25 мая 2010

Предполагая, что вы не будете пытаться использовать сгенерированные заглушки в том же проекте, в котором вы это делаете (что создаст круговые зависимости и будет плохой идеей ...), тогда да, вы можете сделать как то так.

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

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>generate-wsdl</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>wsgen</goal>
                    </goals>
                    <configuration>
                        <sei><!-- fully qualified class name goes here --></sei>
                        <genWsdl>true</genWsdl>
                    </configuration>
                </execution>
                <execution>
                    <id>generate-stubs</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <wsdlDirectory>target/jaxws/wsgen/wsdl</wsdlDirectory>
                        <wsdlFiles>                   
                            <wsdlFile><!-- class name goes here -->Service.wsdl</wsdlFile>
                        </wsdlFiles>
                        <!-- *** you need the next line to set the wsdlLocation in the generated stubs *** -->
                        <wsdlLocation>http://localhost:8080/test</wsdlLocation> 
                    </configuration>
                </execution>
            </executions>
        </plugin>

Обновление - чтобы упаковать сгенерированный код в jar, я бы использовал maven-jar-plugin примерно так:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <id>package-wsclient-jars</id>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <classesDirectory>target/jaxws/<!-- rest of the path here, can't remember it right now --></classesDirectory>
                            <classifier>wsclient</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

Я быстро вставил это из нашего конфига, но наше использование немного отличается (так как мы заархивируем файлы wsdl, а не сгенерированный клиент, но я верю, что это довольно близко познакомит вас). Вам, вероятно, придется настроить версию для maven-jar-plugin, если вы ее еще не используете - 2.3.1, похоже, самая последняя версия.

5 голосов
/ 09 апреля 2013

Мне удалось в том же процессе. Цель состоит в том, чтобы создать JAR прокси веб-службы для веб-служб в нашем приложении.

Веб-сервисы

У нас есть три веб-сервиса в нашем приложении (в настоящее время). Они создаются проектом Maven, который создает WAR с помощью сервиса и вспомогательных классов, который содержит дескриптор sun-jaxws.xml и web.xml.

Проект Maven веб-службы является частью многопроектной сборки, поэтому WAR-служба веб-службы - это один модуль в EAR, который также содержит EJB-файл JAR, WAR-интерфейс пользователя и другие JAR-файлы (а также зависимости).

Клиентский прокси JAR

В идеале я бы создал JAR-прокси клиента в другом проекте Maven, который зависит от проекта WAR веб-службы и использует цели плагина Maven JAX-WS wsgen, за которыми следует wsimport для выполнения работы.

Но я не мог заставить проект Maven использовать WAR как зависимость, чтобы его классы (в WEB-INF/classes) добавлялись в путь классов. Я попробовал плагин AppFuse Warpath , но не смог заставить его распаковать зависимость WAR.

Два артефакта из одного проекта Maven

В итоге мне пришлось прибегнуть к созданию и установке нескольких артефактов в одном проекте Maven. Мои выводы о wsgen и wsimport и втором артефакте:

  • jaxws-maven-plugin нужны собственные зависимости для цели wsgen, если они находятся вне текущего проекта, в противном случае он не сможет их найти. (Даже если verbose установлено true, эта цель выдает мало полезной информации.)
  • Цель wsgen должна вызываться для каждой службы для генерации WSDL.
  • Цель wsimport вызывается один раз для всех WSDL одновременно, поскольку службы совместно используют несколько классов поддержки. (Поскольку все сгенерированные классы входят в один клиентский прокси-пакет, важно, чтобы имена классов не перекрывались между исходными источниками, даже если они происходят из разных пакетов.)
  • maven-jar-plugin:jar и maven-install-plugin:install-file вызываются для упаковки и установки JAR-прокси клиента.

Ниже приведены ключевые части POM с некоторыми комментариями:

<parent>
    <groupId>lighthouse.navigate</groupId>
    <artifactId>navigate</artifactId>
    <version>3.9.0-SNAPSHOT</version>
</parent>

<artifactId>navigate-webservice</artifactId>
<packaging>war</packaging>

<name>Navigate WebService</name>

<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>navigate-util</artifactId>
        <version>${project.version}</version>
        <scope>provided</scope>
    </dependency>
    <!-- snip -->
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.2</version>
            <executions>
                <!-- WSDLs must be generated for each service. -->
                <execution>
                    <id>generate-client-wsdl</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>wsgen</goal>
                    </goals>
                    <configuration>
                        <sei>nav.ws.client.ClientWebService</sei>
                        <genWsdl>true</genWsdl>
                    </configuration>
                </execution>
                <execution>
                    <id>generate-licence-wsdl</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>wsgen</goal>
                    </goals>
                    <configuration>
                        <sei>nav.ws.licence.LicenceWebService</sei>
                        <genWsdl>true</genWsdl>
                    </configuration>
                </execution>
                <!-- snip -->
                <!-- Single generation of client proxy because WSDLs share classes. -->
                <execution>
                    <id>generate-proxies</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <wsdlDirectory>target/generated-sources/wsdl</wsdlDirectory>
                        <destDir>target/wsgen/classes</destDir>
                        <packageName>nav.ws.proxy</packageName>
                        <xnocompile>false</xnocompile>
                    </configuration>
                </execution>
            </executions>
            <!--
                NB: wsgen needs its own dependencies declared so it can find
                classes outside this project.
            -->
            <dependencies>
                <dependency>
                    <groupId>${project.groupId}</groupId>
                    <artifactId>navigate-util</artifactId>
                    <version>${project.version}</version>
                </dependency>
                <!-- snip -->
            </dependencies>
        </plugin>
        <!-- Package client proxy JAR as secondary artifact. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <executions>
                <execution>
                    <id>package-wsclient</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classesDirectory>target/wsgen/classes</classesDirectory>
                        <finalName>navigate-wsclient-${project.version}</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Install client proxy JAR as secondary artifact. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>install-wsclient</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>target/navigate-wsclient-${project.version}.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>navigate-wsclient</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
0 голосов
/ 10 января 2013

Запустив wsgen, затем wsimport, затем wsgen, затем wsimport добьется того, что вам нужно, но вы maven не позволите вам создать модуль дважды. Чтобы обойти это, вы можете запустить maven как задачу ant exec, которая собирает mvn install в текущем каталоге, подключенном к фазе проверки цикла сборки. Это выполнит wsimport, затем wsgen, затем, когда сборка будет продолжена после цикла проверки, она перезапустит wsimport (теперь на вновь созданном wsgen), а затем снова wsgen. Это позволяет вам иметь веб-сервис и веб-клиента, который использует этот сервис, встроенный в тот же модуль maven. Поместите следующую декларацию плагина в ваш файл сборки maven pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <dependencies>
        <dependency>
            <groupId>ant-contrib</groupId>
            <artifactId>ant-contrib</artifactId>
            <version>1.0b3</version>
            <exclusions>
                <exclusion>
                    <groupId>ant</groupId>
                    <artifactId>ant</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <phase>validate</phase>
            <configuration>
                <tasks>
                    <taskdef resource="net/sf/antcontrib/antlib.xml"
                             classpathref="maven.plugin.classpath" />
                    <if>
                        <equals arg1="${antrunned}" arg2="yes"/>
                        <then>
                            <echo message="Good job."/>
                        </then>
                        <else>
                            <exec dir="${basedir}" executable="mvn" failonerror="true">
                                <arg value="install"/>
                                <arg value="-Dantrunned=yes"/>
                            </exec>
                        </else>
                    </if>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>
...