问题描述
我正在使用 WsImport
从远程WSDL文件生成一些Java源代码。请注意,这是来自常规Scala项目,即它不是在Maven或Ant构建中完成的:
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(' '))
}
上述代码工作得很好,我用它从上面的Scala代码以编程方式生成Java WSDL客户端。
The above code works great and I use it to generate a Java WSDL client programatically from above Scala code.
但是,现在,我还想使用一些WsImport插件(例如和):
But, now, I also want to use some WsImport plugins (such as this and this):
val xjcArgs = "-B-Xequals -B-XhashCode -B-Xvalue-constructor"
我收到此错误: no这样的JAXB选项:-Xequals
即使我将以下内容添加到我的类路径中:
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",
如何强制WsImport使用这些插件?或者我是否直接使用除WsImport之外的其他工具(例如ANT)?
How do I force WsImport to use these plugins? Or do I use some other tool besides the WsImport (such as ANT) directly?
尝试使用ANT
我在上面使用 com.sun.tools.ws.WsImport
,但还有另一个 com.sun.tools。 ws.ant.WsImport
我并不完全确定如何使用它。我试过这个:
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()
以上几乎可行但我无法弄清楚如何在ant任务中设置绑定。 wsimport
接收 -b http://www.w3.org/2001/XMLSchema.xsd
但是蚂蚁任务只接受文件作为参数:(
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 :(
推荐答案
你能修改你的 val xjcArgs
在那里包含类路径。例如
Can you modify your val xjcArgs
to include classpath there. e.g
val xjcArgs = - cp_path_ofjaxb2-basics.jar:other_plugin_jar_with_path -B-Xequals -B-XhashCode -B-Xvalue-constructor
以确保在WSImport调用时设置classpath?
val 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.
<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我有以下罐子:
In my D:/tmp.wsimport I have following jars:
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文件。
Just call Ant's default target and you will get proper java files.
。
致电只是WSImport。
Call just the 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
通过自定义类调用。
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
再次使用自定义java类/方法在scala中使用。确保使用我列出的jar正确设置了类路径。
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.
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);
}
}
这篇关于以编程方式将WsImport与没有Maven或ANT的JAXB插件一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!