Search code examples
javagradlecxfjava-11

using Gradle, Apache cxf WSDLToJava generated source code will not compile - missing jakarta packages but dependecies have been referenced


Jakarta packages are not found when the generated Java is compiled. Jakarta dependencies are referenced in build.gradle for the module:

plugins {
    id 'java-library'
}
configurations {
    wsdl2java
}

dependencies {
    wsdl2java 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
    wsdl2java 'com.sun.xml.bind:jaxb-ri:4.0.2'
    wsdl2java 'com.sun.xml.bind:jaxb-xjc:4.0.2'
    wsdl2java 'com.sun.xml.bind:jaxb-core:4.0.2'
    wsdl2java 'com.sun.xml.bind:jaxb-impl:4.0.2'
    wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:4.0.0'
    wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:4.0.0'
    wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:4.0.0'
}

Gradle to generate the code includes

classpath configurations.wsdl2java

Resulting example code includes imports that do not resolve

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlType;

When the task attempts to compile, error is:

error: package jakarta.xml.bind.annotation does not exist
import jakarta.xml.bind.annotation.XmlAccessType;

Yet, all these are supposed to be included in

jakarta.xml.bind:jakarta.xml.bind-api:4.0.0

Full build.gradle file is:

plugins {
    id 'java-library'
}
configurations {
    wsdl2java
}

dependencies {
    wsdl2java 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
    wsdl2java 'com.sun.xml.bind:jaxb-ri:4.0.2'
    wsdl2java 'com.sun.xml.bind:jaxb-xjc:4.0.2'
    wsdl2java 'com.sun.xml.bind:jaxb-core:4.0.2'
    wsdl2java 'com.sun.xml.bind:jaxb-impl:4.0.2'
    wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:4.0.0'
    wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:4.0.0'
    wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:4.0.0'
}

def allmyWsdl = task allmyWsdl {
    String[] wsdls = ["one", "two", "three"];

    wsdls.each {name->
        def thing = task "myWsdl${name}" (type: JavaExec) {
            // Defining these mean the task can run incrementally
            inputs.files("${projectDir}/src/main/resources")
            outputs.dir("${projectDir}/out/generated-sources/cxf-ws")

            String wsdl = "${projectDir}/src/main/resources/wsdls/${name}.wsdl"
            String genSrcDir = "${projectDir}/out/generated-sources/cxf-ws"

            inputs.file wsdl
            outputs.dir genSrcDir

            classpath configurations.wsdl2java
            main "org.apache.cxf.tools.wsdlto.WSDLToJava"

            args '-client', '-impl', '-exsh', 'true', '-noAddressBinding', '-autoNameResolution', "-wsdlLocation", "classpath:wsdls/${name}.wsdl", '-p', "com.my.webservices.${name}", '-encoding', 'UTF-8', '-d', genSrcDir, wsdl

            final OutputStream baos = new ByteArrayOutputStream()
            errorOutput = new OutputStream() {
                void write(int b) {System.err.write(b); baos.write(b) }
                void flush() { System.err.flush(); baos.flush() }
                void close() { System.err.close(); baos.close() }
            }

            doLast {
                def str = baos.toString()
                if (str.contains('Usage : wsdl2java') || str.contains('WSDLToJava Error')) {
                    throw new TaskExecutionException(tasks[name],
                            new IOException('Apache CXF WSDLToJava has failed. Please see System.err output.'))
                }
            }
        }
    }
}

allmyWsdl.dependsOn(tasks.matching { task -> task.name.startsWith( 'myWsdl' ) } )
compileJava.dependsOn += allmyWsdl
sourceSets.main.java.srcDirs += 'out/generated-sources/cxf-ws'

Solution

  • The issue is that while generating java from wsdl you are adding all libraries to classpath classpath configurations.wsdl2java. But while compiling those libraries are not in the classpath so you get those errors.

    You need to adjust dependencies section as follow.

    dependencies {
        implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
        implementation 'jakarta.xml.ws:jakarta.xml.ws-api:4.0.0'
        wsdl2java 'com.sun.xml.bind:jaxb-ri:4.0.2'
        wsdl2java 'com.sun.xml.bind:jaxb-xjc:4.0.2'
        wsdl2java 'com.sun.xml.bind:jaxb-core:4.0.2'
        wsdl2java 'com.sun.xml.bind:jaxb-impl:4.0.2'
        wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:4.0.0'
        wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:4.0.0'
        wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:4.0.0'
    }
    

    As jakarta.xml.bind-api and jakarta.xml.ws-api libraries don't need while generating java classes. But those are required while compiling. So added those 2 as implementation dependencies which adds to Java compile and runtime classpaths.