使用 Maven 使用 wsdlLocation 连续触发 wsgen & wsimport

2022-09-04 00:42:02

我很难使用maven来生成我的Web服务客户端。因此,请参阅直接从源代码创建 Web 服务客户端,了解我问题的第一部分。

为了保持简单和简短,我想从这里开始(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 文件。

请注意末尾的 wsdl 位置设置。pom.xml文件可能会同时使用maven-jaxws-plugin和一些棘手的配置来实现这一点。wsgenwsimport


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

更新 - 要将生成的代码打包成一个jar,我会像这样使用maven-jar-插件

            <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

我在同样的过程中取得了成功。目的是为应用程序中的 Web 服务创建一个 Web 服务代理 JAR。

网络服务

我们的应用程序中有三个 Web 服务(目前)。它们由 Maven 项目创建,该项目使用服务和支持类生成 WAR,其中包含描述符和 .sun-jaxws.xmlweb.xml

Web服务Maven项目是多项目构建的一部分,因此Web服务WAR是EAR中的一个模块,该模块还具有EJB JAR,用户界面WAR和其他JAR(以及依赖项)。

客户端代理 JAR

理想情况下,我会在另一个依赖于Web服务WAR项目的Maven项目中创建客户端代理JAR,并使用Maven JAX-WS插件目标来完成工作。wsgenwsimport

但是我无法让 Maven 项目使用 WAR 作为 depedency,以便将其类(in )添加到类路径中。我尝试了AppFuse Warpath插件,但无法让它解压缩WAR依赖项。WEB-INF/classes

来自一个 Maven 项目的两个工件

最后,我不得不在一个Maven项目中构建和安装多个工件。我发现和和二个工件:wsgenwsimport

  • jaxws-maven-plugin如果目标在当前项目之外,则需要自己的依赖项,否则找不到它们。(即使设定了这个目标,也不会发出什么有用的信息。wsgenverbosetrue
  • 必须为每个服务调用目标才能生成 WSDL。wsgen
  • 该目标一次在所有 WSDL 上调用一次,因为这些服务共享许多支持类。(由于所有生成的类都进入一个客户端代理包,因此在原始源之间不要有类名重叠非常重要,即使它们源自不同的包中也是如此。wsimport
  • maven-jar-plugin:jar并被调用来打包和安装客户端代理 JAR。maven-install-plugin:install-file

以下是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>

推荐