Программно использовать WsImport с плагинами JAXB без Maven или ANT?
Я использую WsImport
для генерации некоторых источников Java из удаленного файла WSDL. Обратите внимание, что это происходит из обычного проекта Scala, т.е. Он не выполняется в Maven или 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(' '))
}
Вышеприведенный код отлично работает, и я использую его для создания Java WSDL-клиента программно из-за кода Scala.
Но теперь я также хочу использовать некоторые плагины WsImport (например, это и это):
val xjcArgs = "-B-Xequals -B-XhashCode -B-Xvalue-constructor"
Я получаю эту ошибку: no such JAXB option: -Xequals
хотя я добавил следующее в мой no such JAXB option: -Xequals
к классам:
"org.jvnet.jaxb2_commons" % "jaxb2-basics" % "1.11.1",
"org.jvnet.jaxb2_commons" % "jaxb2-value-constructor" % "3.0",
Как заставить WsImport использовать эти плагины? Или я использую какой-то другой инструмент, кроме WsImport (например, ANT) напрямую?
Попытка с помощью ANT
Я использую com.sun.tools.ws.WsImport
выше, но есть еще один com.sun.tools.ws.ant.WsImport
и я не уверен, как его использовать. Я попробовал это:
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()
Вышеупомянутое "почти работает", но я не могу понять, как установить привязку в муравьиной задаче. wsimport
принимает -b http://www.w3.org/2001/XMLSchema.xsd
но муравьиная задача принимает файлы только как аргументы :(
Ответы
Ответ 1
Можете ли вы изменить свой val xjcArgs
чтобы включить туда val xjcArgs
к классам. например
val xjcArgs = "-cp _path_ofjaxb2-basics.jar:other_plugin_jar_with_path -B-Xequals -B-XhashCode -B-Xvalue-constructor"
чтобы убедиться, что путь класса установлен на вызов WSImport?
редактировать
На основе комментариев: вот моя команда ant, которая делает. В основном вам нужны все поддерживающие банки.
<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>
В моем D: /tmp.wsimport у меня есть следующие банки:
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
Просто назовите цель Ant по умолчанию, и вы получите соответствующие java файлы.
Изменить 2 для поддержки командной строки/программного вызова.
,
Опция 1:
Вызовите только 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
Вариант 2
Вызовите через пользовательский класс.
Класс Java:
package test;
import com.sun.tools.ws.WsImport;
public class Test
{
public static void main(String args []) throws Throwable
{
WsImport.doMain(args);
}
}
Вызов командной строки
"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
Вариант 2c
Опять же пользовательский класс/метод java, который вы можете использовать в scala для использования. Убедитесь, что у вас есть правильный путь к классу с указанными мной банками.
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);
}
}
Ответ 2
Я нахожусь в том же тупике, что и автор потока, пытающегося настроить генерации исходного кода градиента Java из wsdl.
И причина этого в jaxb2-basics
реализует com.sun.tools.xjc.Plugin
и @Optional в его ответе относится к com.sun.tools.ws.WsImport
. В то же время wsimport
полезность "современного" Jdk8 скорее реализует com.sun.tools.internal.ws.WsImport
и использует com.sun.tools.internal.xjc.Plugin
. Итак, jaxb2-basics
становятся своего рода устаревшими для использования с wsimport
Jdk8.
Решением будет использование альтернативной библиотеки для обеспечения WsImport в "старом" пространстве имен. Например, com.sun.xml.ws:jaxws-tools:2.3.0
. В Gradle это выглядит так:
configurations {
jaxws
}
dependencies {
jaxws 'org.jvnet.jaxb2_commons:jaxb2-basics:0.11.1'
jaxws 'com.sun.xml.ws:jaxws-tools:2.3.0'
compile 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime:0.11.1'
}
wsdlServices.each { u ->
task "ws${u.service}" (type: JavaExec) {
classpath = configurations.jaxws
workingDir = generatedDir
main = 'com.sun.tools.ws.WsImport'
args = ['-keep', '-Xnocompile', '-B-XtoString', '-B-Xequals', '-B-XhashCode', u.url]
compileJava.dependsOn path // depends on current task
}
}
и в командной строке это будет:
java -cp "lib/*" com.sun.tools.ws.WsImport -extension -keep -Xnocompile -B-XtoString 'http://www.webservicex.com/globalweather.asmx?WSDL'
где lib содержит
commons-beanutils-1.9.2.jar
commons-collections-3.2.1.jar
commons-lang3-3.2.1.jar
FastInfoset-1.2.13.jar
gmbal-api-only-3.1.0-b001.jar
ha-api-3.1.9.jar
javaparser-1.0.11.jar
javax.annotation-api-1.3.jar
javax.xml.soap-api-1.4.0.jar
jaxb2-basics-0.11.1.jar
jaxb2-basics-runtime-0.11.1.jar
jaxb2-basics-tools-0.11.1.jar
jaxb-api-2.3.0.jar
jaxb-core-2.3.0.jar
jaxb-impl-2.3.0.jar
jaxb-jxc-2.3.0.jar
jaxb-xjc-2.3.0.jar
jaxws-api-2.3.0.jar
jaxws-rt-2.3.0.jar
jaxws-tools-2.3.0.jar
jcl-over-slf4j-1.7.7.jar
jsr181-api-1.0-MR1.jar
management-api-3.0.0-b012.jar
mimepull-1.9.7.jar
policy-2.7.2.jar
resolver-20050927.jar
saaj-impl-1.4.0.jar
slf4j-api-1.7.7.jar
stax-ex-1.7.8.jar
streambuffer-1.5.4.jar
ie org.jvnet.jaxb2_commons:jaxb2-basics:0.11.1
и com.sun.xml.ws:jaxws-tools:2.3.0
с зависимостями