以编程方式将WsImport与没有Maven或ANT的JAXB插件一起使用?

我正在使用WsImport从远程WSDL文件生成一些Java源代码。 请注意,这是来自常规Scala项目,即它不是在Maven或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(' ')) } 

上面的代码非常有用,我用它来从Scala代码上以编程方式生成Java WSDL客户端。

但是,现在,我还想使用一些WsImport插件(例如this和this ):

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

我收到此错误: 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() 

上面的“几乎可以工作”,但我无法弄清楚如何在ant任务中设置绑定。 wsimport接受-b http://www.w3.org/2001/XMLSchema.xsd但ant任务只接受文件作为参数:(

你可以修改你的val xjcArgs以包含类路径。 例如

val xjcArgs = "-cp _path_ofjaxb2-basics.jar:other_plugin_jar_with_path -B-Xequals -B-XhashCode -B-Xvalue-constructor"以确保在WSImport调用时设置classpath?

编辑

基于评论:这是我的ant命令。 基本上你也需要所有的支持jar子。

                

在我的D:/tmp.wsimport中我有以下jar子:

  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

再一个可以在scala中使用的自定义java类/方法。 确保使用我列出的jar正确设置了类路径。

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

我和线程的作者试图从wsdl调整gradle的Java源代码生成时遇到了同样的僵局。

原因是jaxb2-basics在他的回答中实现了com.sun.tools.xjc.Plugin和@Optional指的是com.sun.tools.ws.WsImport 。 与此同时,“现代”Jdk8的wsimport实用程序实现了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.1com.sun.xml.ws:jaxws-tools:2.3.0 with dependencies