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);
}
}