Reputation: 4867
I want to switch my Maven2 build file to gradle. Generating the java classes from WSDL + XSDs with gradle seems to be not documented further there is no gradle plugin for this. I use the following configuration with maven and search the equivalent for gradle.
<!-- plugin for generating the classes from the WSDL+XSD -->
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.7.3</version>
<executions>
<execution>
<id>app1-stub-generation</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>${project.build.directory}/wsdl/app1</schemaDirectory>
<schemaIncludes>
<include>*.xsd</include>
</schemaIncludes>
<generatePackage>org.app1.ws.generated</generatePackage>
<generateDirectory>${project.build.directory}/generated-sources/app1</generateDirectory>
<strict>true</strict>
</configuration>
</execution>
<execution>
<id>app2-v1-stub-generation</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources/wsdl</schemaDirectory>
<schemaIncludes>
<include>v1/*.xsd</include>
</schemaIncludes>
<generatePackage>org.app2.ws.generated.v1</generatePackage>
<generateDirectory>${project.build.directory}/generated-sources/v1</generateDirectory>
<strict>true</strict>
</configuration>
</execution>
<execution>
<id>app2-v2-stub-generation</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources/wsdl</schemaDirectory>
<schemaIncludes>
<include>v2/*.xsd</include>
</schemaIncludes>
<generatePackage>org.app2.ws.generated.v2</generatePackage>
<generateDirectory>${project.build.directory}/generated-sources/v2</generateDirectory>
<strict>true</strict>
</configuration>
</execution>
</executions>
</plugin>
Upvotes: 15
Views: 44009
Reputation: 2850
I found the xjc-generation-gradle-plugin to be easy to use and well-documented.
If you put your .wsdl
file into src/main/schemas/xjc
then you can generate java classes from it with this config in your build.gradle:
plugins {
id 'com.github.edeandrea.xjc-generation' version '1.6'
}
ext {
jaxbVersion = '2.2.11'
}
dependencies {
implementation "javax.xml.bind:jaxb-api:$jaxbVersion"
xjc "javax.xml.bind:jaxb-api:$jaxbVersion"
xjc "com.sun.xml.bind:jaxb-impl:$jaxbVersion"
xjc "com.sun.xml.bind:jaxb-xjc:$jaxbVersion"
xjc "com.sun.xml.bind:jaxb-core:$jaxbVersion"
xjc 'javax.activation:activation:1.1.1'
}
xjcGeneration {
defaultAdditionalXjcOptions = ['encoding': 'UTF-8']
schemas {
wsdlSchema {
schemaFile = 'my.wsdl'
javaPackageName = 'com.example'
sourceSet = 'main'
}
}
}
In this example the .wsdl file is src/main/schemas/xjc/my.wsdl
and the classes are generated in the build/generated-sources/main/xjc/com.example
directory.
If your WSDL types section contains repeated types then you will see schema compilation errors like this:
[ant:xjc] [ERROR] A class/interface with the same name "com.example.MyClass" is already in use. Use a class customization to resolve this conflict.
To avoid these errors add this setting to the xjcGeneration
task:
defaultAdditionalXjcCommandLineArgs = ["-XautoNameResolution": ""]
Upvotes: 0
Reputation: 123890
If you can't find a Gradle plugin for a particular need (and don't want to write your own plugin), look out for an Ant task. Here is one for JAXB: XJC Ant Task.
Any Ant task can be used as-is from Gradle (see Using Ant from Gradle). In the future, Gradle will also support the execution of Maven plugins.
Upvotes: 13
Reputation: 2322
Use the plugin as described here: https://github.com/nilsmagnus/wsdl2java
Note: as of 2020, this advice is no longer applicable, as the recommended plugin has been discontinued and no longer works with newer versions of Gradle.
Upvotes: 6
Reputation: 4867
i solved it...
configurations {
jaxb
}
dependencies {
jaxb group: 'com.sun.xml.bind', name: 'jaxb-xjc', version: '2.2.4-1'
}
task jaxb () {
// output directory
jaxbTargetDir = file( "${buildDir}/generated-sources" )
jaxbTargetDirV19 = file( jaxbTargetDir.path + '/v19' )
jaxbTargetDirV110 = file( jaxbTargetDir.path + '/v110' )
jaxbTargetDirOtherWs = file( jaxbTargetDir.path + '/otherWs' )
// perform actions
doLast {
jaxbTargetDirV19.mkdirs()
jaxbTargetDirV110.mkdirs()
jaxbTargetDirOtherWs.mkdirs()
ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath)
ant.jaxbTargetDirV19 = jaxbTargetDirV19
ant.jaxbTargetDirV110 = jaxbTargetDirV110
ant.jaxbTargetDirOtherWs = jaxbTargetDirOtherWs
// My-Webservice v1.10
ant.xjc(
destdir: '${jaxbTargetDirV110}',
package: 'mypackage.ws.generated.v110',
schema: 'src/main/resources/wsdl/v1.10/MyServiceSchema.xsd'
)
// My-Webservice v1.9
ant.xjc(
destdir: '${jaxbTargetDirV19}',
package: 'mypackage.ws.generated.v19',
schema: 'src/main/resources/wsdl/v1.9/MyServiceSchema.xsd'
)
// OtherWs-Webservice
ant.xjc(
destdir: '${jaxbTargetDirOtherWs}',
package: 'mypackage.otherws.generated',
schema: 'src/main/resources/wsdl/OtherWsServiceSchema.xsd'
)
}
}
compileJava.dependsOn jaxb
Upvotes: 23