I am using WsImport
to generate some Java sources from a remote WSDL file. Note that this is being from inside a regular Scala project i.e. it is not being done in a Maven or Ant build:
import com.sun.tools.ws.WsImport
def run(wsdlFile: File, destination: File, packageName: String = "generated"): Seq[File] = {
sys.props("javax.xml.accessExternalDTD") = "all"
sys.props("javax.xml.accessExternalSchema") = "all"
val xjcArgs = "" //TODO
val args = s"-Xnocompile -XadditionalHeaders $xjcArgs -J-Djavax.xml.accessExternalDTD=all -b http://www.w3.org/2001/XMLSchema.xsd -p $packageName -s $destination $wsdlFile"
WsImport.doMain(args.split(' '))
}
The above code works great and I use it to generate a Java WSDL client programatically from above Scala code.
But, now, I also want to use some WsImport plugins (such as this and this):
val xjcArgs = "-B-Xequals -B-XhashCode -B-Xvalue-constructor"
I am getting this error: no such JAXB option: -Xequals
even though I added the following to my classpath:
"org.jvnet.jaxb2_commons" % "jaxb2-basics" % "1.11.1",
"org.jvnet.jaxb2_commons" % "jaxb2-value-constructor" % "3.0",
How do I force WsImport to use these plugins? Or do I use some other tool besides the WsImport (such as ANT) directly?
Trying with ANT
I am using com.sun.tools.ws.WsImport
above but there is also another com.sun.tools.ws.ant.WsImport
and I am not compeltely sure how to use it. I tried this:
val task = new com.sun.tools.ws.ant.WsImport2()
task.setPackage(packageName)
task.setWsdl(wsdlFile.getAbsolutePath)
task.setDestdir(destination.getAbsoluteFile)
task.setGenerateJWS(true)
task.setXadditionalHeaders(true)
task.setXnocompile(true)
task.setBinding("http://www.w3.org/2001/XMLSchema.xsd")
task.execute()
The above "almost works" but I can't figure out how to set binding in the ant task. wsimport
takes in a -b http://www.w3.org/2001/XMLSchema.xsd
but the ant task only accepts files as arguments :(
I am at the same deadlock as the author of the thread trying to tweak gradle's Java source code generation from wsdl.
And the reason for that is
jaxb2-basics
implementscom.sun.tools.xjc.Plugin
and @Optional in his answer refers tocom.sun.tools.ws.WsImport
. At the same timewsimport
utility of "modern" Jdk8 rather implementscom.sun.tools.internal.ws.WsImport
and usecom.sun.tools.internal.xjc.Plugin
. Sojaxb2-basics
become kind of obsolete for using withwsimport
of Jdk8.The solution would be to use alternative library to provide WsImport in "old" namespace. E.g.
com.sun.xml.ws:jaxws-tools:2.3.0
. In Gradle it looks like:and in command line this will be:
where lib contains
i.e.
org.jvnet.jaxb2_commons:jaxb2-basics:0.11.1
andcom.sun.xml.ws:jaxws-tools:2.3.0
with dependenciesCan you modify your
val xjcArgs
to include classpath there. e.gval xjcArgs = "-cp _path_ofjaxb2-basics.jar:other_plugin_jar_with_path -B-Xequals -B-XhashCode -B-Xvalue-constructor"
to make sure classpath is set on WSImport call?Based on comment: here is my ant command that does. Basically you need all the supporting jars as well.
In my D:/tmp.wsimport I have following jars:
Just call Ant's default target and you will get proper java files.
.
Call just the WSImport.
Call via custom class.
Java class:
Command prompt call
Again a custom java class/method which you can use in scala to use. Make sure you have the classpath properly set with the jars I listed.