Подтвердить что ты не робот

Используйте Maven для запуска wsgen & wsimport в строке, используя wsdlLocation

Мне сложно использовать 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

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

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

4b9b3361

Ответ 1

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

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

        <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>

Обновить - чтобы упаковать сгенерированный код в банку, я бы использовал 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 кажется последним.

Ответ 2

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

Веб-службы

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

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

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

В идеале я бы создал клиентский прокси-сервер JAR в другом проекте Maven, который зависит от проекта WAR 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>

Ответ 3

Запуск 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>