Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate JAX-WS classes from WSDL file using Maven plugin with Java11

In Java 11, JAX-WS has been removed from the JDK. It prevents to generate easily JAX-WS classes with a Maven plugin using wsimport under the hood. I am using the following configuration for the Maven plugin 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>

Is there an easy way to install wsimport or to use another plugin bundling an architecture specific wsimport to continue generating WSDL classes?

like image 558
Nicolas Henneaux Avatar asked Nov 06 '18 13:11

Nicolas Henneaux


People also ask

How do I create a class using WSDL?

The fields are mandatory if the WSDL location requires authentication. Specify the module source directory to place the generated files in. Specify the package for the compiled Java classes. Specify whether you want to generate Java code only for the client side or for the server side as well.

How do you convert WSDL to Java classes?

If you would like to parse a WSDL file to generate java classes, you can use the wsimport tool. This 'wsimport' tool comes with the JDK (Java Development Kit) and resides in the JDK bin directory.


2 Answers

the new version of jaxws-maven-plugin (link) can generate Java classes with Java 11, using the plugin as follows:

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

An alternative plugin can also be the cxf-codegen-plugin from Apache CXF (link)

UPDATE

If you want to use the newer JakartaEE 9.0+ packages, you need to use the following plugin, keeping the same configurations:

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

and for jaxb:

<groupId>com.evolvedbinary.maven.mojohaus</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<version>3.0.0</version>
like image 158
madduci Avatar answered Oct 12 '22 12:10

madduci


Found this - https://github.com/mojohaus/jaxws-maven-plugin/issues/54#issuecomment-440597801 I used the same configuration as for org.jvnet.jax-ws-commons jaxws-maven-plugin. Think it is the same as org.codehaus.mojo, but don't 100% sure.

Tested with JDK 11. All XSD elements, ports and services are generated. You also need to add a few dependencies to your pom. Minimum:

        <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>
like image 25
bearwithbeard Avatar answered Oct 12 '22 14:10

bearwithbeard