plugin org jvnet jaxws jax failed commons java jaxb jaxb2 wsimport jaxb2-basics

java - org - jaxws maven-< plugin



¿Utiliza Programment WsImport con complementos JAXB sin Maven o ANT? (1)

Estoy usando WsImport para generar algunas fuentes Java desde un archivo WSDL remoto. Tenga en cuenta que esto proviene de un proyecto Scala normal, es decir, no se está realizando en una compilación Maven o Ant:

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('' '')) }

El código anterior funciona muy bien y lo uso para generar un cliente Java WSDL programáticamente desde el código anterior de Scala.

Pero, ahora, también quiero usar algunos complementos de WsImport (como este y este ):

val xjcArgs = "-B-Xequals -B-XhashCode -B-Xvalue-constructor"

Recibo este error: no such JAXB option: -Xequals aunque agregué lo siguiente a mi classpath:

"org.jvnet.jaxb2_commons" % "jaxb2-basics" % "1.11.1", "org.jvnet.jaxb2_commons" % "jaxb2-value-constructor" % "3.0",

¿Cómo obligo a WsImport a utilizar estos complementos? ¿O utilizo alguna otra herramienta además del WsImport (como ANT) directamente?

Probando con ANT

Estoy usando com.sun.tools.ws.WsImport arriba, pero también hay otro com.sun.tools.ws.ant.WsImport y no estoy muy seguro de cómo usarlo. Intenté esto:

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

Lo anterior "casi funciona" pero no puedo encontrar la forma de establecer el enlace en la tarea de la hormiga. wsimport toma en -b http://www.w3.org/2001/XMLSchema.xsd pero la tarea ant solo acepta archivos como argumentos :(


¿Puedes modificar tus val xjcArgs para incluir classpath allí? p.ej

val xjcArgs = "-cp _path_ofjaxb2-basics.jar:other_plugin_jar_with_path -B-Xequals -B-XhashCode -B-Xvalue-constructor" para asegurarse de que classpath esté configurado en la llamada WSImport?

Editar

Basado en el comentario: aquí está mi comando ant que lo hace. Básicamente también necesitas todos los frascos de apoyo.

<project name="jaxws-stack" default="wsimport"> <property name="jaxws.home" location="D:/tmp/wsimport"/> <path id="wsimport.classpath"> <fileset dir="${basedir}/lib"> <include name="*.jar"/> </fileset> </path> <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" classpathref="wsimport.classpath"/> <target name="wsimport"> <wsimport keep="true" verbose="true" wsdl="mywsdlurl_path"> <xjcarg value="-Xequals"/> <xjcarg value="-XhashCode"/> <xjcarg value="-Xvalue-constructor"/> </wsimport> </target>

En mi D: /tmp.wsimport tengo los siguientes tarros:

233,859 commons-beanutils-1.9.2.jar 315,805 commons-lang3-3.1.jar 293,543 commons-lang3-3.1.jar.zip 60,686 commons-logging-1.1.1.jar 23,205 istack-commons-runtime-2.21.jar 7,595 istack-commons-tools-1.1.jar 25,446 istack-commons-tools-2.21.jar 866,992 jaxb-impl-2.1.10.jar 3,147,690 jaxb-xjc-2.1.11.jar 141,087 jaxb2-basics-1.11.1.jar 166,736 jaxb2-basics-runtime-1.11.1.jar 141,604 jaxb2-basics-tools-1.11.1.jar 5,756 jaxb2-value-constructor-3.0.jar 1,284,131 jaxws-rt-2.1.4.jar 510,892 jaxws-tools-2.1.4.jar 33,739 stax-ex-1.7.7.jar 130,161 streambuffer-0.9.jar

Simplemente llame al objetivo predeterminado de Ant y obtendrá los archivos java adecuados.

Edite 2 para admitir la línea de comando / llamada programática.

.

Opción 1:

Llamar solo a la WSImport.

"jdk_location/bin/java.exe" -cp "lib/*" com.sun.tools.ws.WsImport -keep -verbose -B-Xequals -B-XhashCode -B-Xvalue-constructor http://www.webservicex.com/globalweather.asmx?WSDL

opcion 2

Llamar a través de clases personalizadas.

Clase de Java:

package test; import com.sun.tools.ws.WsImport; public class Test { public static void main(String args []) throws Throwable { WsImport.doMain(args); } }

Llamada de símbolo del sistema

"jdk_location/bin/java.exe" -cp ".;lib/*" test.Test -keep -verbose -B-Xequals -B-XhashCode -B-Xvalue-constructo r -Xnocompile http://www.webservicex.com/globalweather.asmx?WSDL

Opción 2c

De nuevo, una clase / método Java personalizado que puede usar en Scala para usar. Asegúrate de tener el classpath configurado correctamente con los jar que he enumerado.

package test; import com.sun.tools.ws.WsImport; public class MyWSImport { public static void main(String[] args) throws Throwable { String [] input = new String[] {"-keep", "-verbose","-B-Xequals", "-B-XhashCode", "-B-Xvalue-constructor","-Xnocompile", "http://www.webservicex.com/globalweather.asmx?WSDL"}; WsImport.doMain(input); } public void execute() throws Throwable { String [] input = new String[] {"-keep", "-verbose","-B-Xequals", "-B-XhashCode", "-B-Xvalue-constructor","-Xnocompile", "http://www.webservicex.com/globalweather.asmx?WSDL"}; WsImport.doMain(input); } }