Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JDK8 not working with JDK8 (WS client)

I have a very simple (existing) web service that I would like to generate a web service client against using JDK8.

I'm using a pure JDK8 tool chain meaning I use the wsimport tool from my JDK8 dir.

Now to the problem: The Java source code generated by the wsimport tool in JDK8 is not JDK8 Javadoc compliant. As you may be aware the Javadoc tool has become a lot more strict in JDK8.

Consider the following simple schema:

<xs:schema version="1.0" targetNamespace="http://mavenwsserver.ws.mytest.org/">
  <xs:element name="operation" type="tns:operation"/>
  <xs:element name="operationResponse" type="tns:operationResponse"/>
  <xs:complexType name="operation">
    <xs:sequence>
      <xs:element name="person" type="tns:person" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="person">
    <xs:sequence>
      <xs:element name="firstName" type="xs:string" minOccurs="0"/>
      <xs:element name="lastName" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="operationResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

For this the wsimport tool will generate Java code as follows:

package org.mytest.ws.mavenwsclient;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for person complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="person">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "person", propOrder = {
    "firstName",
    "lastName"
})
public class Person {

    protected String firstName;
    protected String lastName;

    /**
     * Gets the value of the firstName property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * Sets the value of the firstName property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setFirstName(String value) {
        this.firstName = value;
    }

    /**
     * Gets the value of the lastName property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * Sets the value of the lastName property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setLastName(String value) {
        this.lastName = value;
    }

}

The problem is the generated comments for this class. While this type of comments would be accepted by the Javadoc compiler in JDK7 it no longer works in JDK8. (the end > must be replaced by &gt; in order for it to be correct in JDK8). The result of these invalid comments is that the build fails.

I know I can turn off doclint in JDK8 but I wonder if I'm doing something wrong here. It's just pure JDK8 tools. Nothing fancy. These tools are supposed to work together right? and have been thoroughly tested with each other before being released by Oracle? So I'm assuming I'm doing something wrong. Like what?

Thanks.

STEPS TO REPRODUCE

Link to WSDL (includes schema)

Download this file to somewhere on your harddrive.

I use a wsimport command line like this:

mkdir D:\JavaDevHG\MavenWSClient\target\generated-sources\jaxws-wsimport

"C:\Program Files\Java\jdk1.8.0_05\bin\wsimport" -keep ^
  -s D:\JavaDevHG\MavenWSClient\target\generated-sources\jaxws-wsimport ^
  D:/JavaDevHG/MavenWSClient/src/main/wsdl/myWSDL.xml

Now run javadoc on the generated sources:

"C:\Program Files\Java\jdk1.8.0_05\bin\javadoc" ^
   -sourcepath D:\JavaDevHG\MavenWSClient\target\generated-sources\jaxws-wsimport ^
   -subpackages org

You'll see something like this:

Loading source files for package org.mytest.ws.mavenwsserver...
Constructing Javadoc information...
Standard Doclet version 1.8.0_05
Building tree for all the packages and classes...
Generating .\org\mytest\ws\mavenwsserver\HelloWorldWebService.html...
...
...
Generating .\org\mytest\ws\mavenwsserver\Person.html...
..\..\..\target\generated-sources\jaxws-wsimport\org\mytest\ws\mavenwsserver\Person.java:15: error: bad use of '>'
 * &lt;complexType name="person">
                                ^
..\..\..\target\generated-sources\jaxws-wsimport\org\mytest\ws\mavenwsserver\Person.java:16: error: bad use of '>'
 *   &lt;complexContent>
...
...                       ^

Note that Javadoc tool also produces a bunch of WARNINGs. I can live with that. It's the ERRORs that make the build fail.

like image 604
peterh Avatar asked Jun 30 '14 17:06

peterh


1 Answers

I could only confirm your findings. Since the setup required to reproduce this is minimal, with no loose ends, the only reasonable conclusion so far is that this is a bug in the wsimport tool packaged with the OpenJDK 8. This tool has simply not been updated to reflect the new restrictions imposed by the javadoc tool of the same JDK package.

like image 100
Marko Topolnik Avatar answered Nov 15 '22 00:11

Marko Topolnik