使用 Maven 插件在 Java11 下从 WSDL 文件生成 JAX-WS 类

14

在Java 11中,JAX-WS已从JDK中删除。这导致使用Maven插件 wsimport 轻松生成JAX-WS类时遇到问题。我正在使用以下配置的Maven插件 org.codehaus.mojo:jaxws-maven-plugin

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <extension>true</extension>
                <packageName>tech.myproject.service</packageName>
                <wsdlFiles>
                    <wsdlFile>${basedir}/src/main/resources/wsdl/service.wsdl</wsdlFile>
                </wsdlFiles>
                <wsdlLocation>/wsdl/service.wsdl</wsdlLocation>
            </configuration>
        </execution>
    </executions>
</plugin>
有没有一种简单的方法来安装wsimport或者使用另一个插件捆绑特定于体系结构的wsimport来继续生成WSDL类?

可能会有所帮助 - https://github.com/mojohaus/jaxws-maven-plugin/issues/67#issuecomment-425423521 - Naman
2个回答

16

新版本的jaxws-maven-plugin (链接) 可以生成适用于Java 11的Java类,使用以下插件:

<build>
<plugins>
...
<plugin>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.3.2</version>
    <executions>
      <execution>
        <id>generate-java-sources</id>
        <phase>process-sources</phase>
        <goals>
          <goal>wsimport</goal>
        </goals>
        <configuration>
          <extension>true</extension>
          <wsdlFiles>
            <wsdlFile>${project.build.directory}/generated/wsdl/MyService.wsdl</wsdlFile>
          </wsdlFiles>
          <wsdlLocation>/wsdl/MyService.wsdl</wsdlLocation>
        </configuration>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
      </dependency>
      <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
      </dependency>
      <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
      </dependency>
      <dependency>
        <groupId>javax.jws</groupId>
        <artifactId>javax.jws-api</artifactId>
        <version>1.1</version>
      </dependency>
    </dependencies>
  </plugin>
</plugins>
</build>

另一个选择是来自Apache CXF的cxf-codegen-plugin(链接)。

更新

如果您想使用更新的JakartaEE 9.0+软件包,您需要使用以下插件,保持相同的配置:

<build>
<plugins>
...
<plugin>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
      <execution>
        <id>generate-java-sources</id>
        <phase>process-sources</phase>
        <goals>
          <goal>wsimport</goal>
        </goals>
        <configuration>
          <extension>true</extension>
          <wsdlFiles>
            <wsdlFile>${project.build.directory}/generated/wsdl/MyService.wsdl</wsdlFile>
          </wsdlFiles>
          <wsdlLocation>/wsdl/MyService.wsdl</wsdlLocation>
        </configuration>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>3.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>javax.transaction</groupId>
                <artifactId>javax.transaction-api</artifactId>
            </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>jakarta.xml.ws</groupId>
        <artifactId>jakarta.xml.ws-api</artifactId>
        <version>3.0.0</version>
      </dependency>
    </dependencies>
  </plugin>
</plugins>
</build>

还有针对jaxb的:

<groupId>com.evolvedbinary.maven.mojohaus</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<version>3.0.0</version>

<phase>process-classes</phase> 这个阶段破坏了我的构建,因为生成的类没有被生成,除此之外一切都好,谢谢! - Nicolas Henneaux
它不为我生成带有“Service”后缀的类。 - Max Lich
1
这有所帮助。必须将以下内容更新从<groupId>org.codehaus.mojo</groupId> --> to <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId>。之后必须导入一些Jakarta相关的依赖项。 - DecKno
2
请注意,块<configuration>必须位于块<execution>之外,它必须与<plugin>处于同一级别。 - Stéphane Millien

4

发现了这个 - https://github.com/mojohaus/jaxws-maven-plugin/issues/54#issuecomment-440597801 我使用了与org.jvnet.jax-ws-commons jaxws-maven-plugin相同的配置。认为它与org.codehaus.mojo相同,但不100%确定。

在JDK 11上进行了测试。所有XSD元素、端口和服务都已生成。 您还需要将一些依赖项添加到您的POM中。 最少:

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.ws</groupId>
            <artifactId>jaxws-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.main.javaee-api</groupId>
            <artifactId>javax.jws</artifactId>
            <version>3.1.2.2</version>
        </dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接