- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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 任务中设置绑定(bind)。 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 调用上设置了类路径?
Edit
根据评论:这是我的 ant 命令。基本上,您还需要所有支持的 jar。
<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 中有以下 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 文件。
Edit 2 to support command line/programmatic call.
.
Option 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
Option 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
Option 2c
又是一个自定义的 java 类/方法,您可以在 scala 中使用它。确保使用我列出的 jars 正确设置了类路径。
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);
}
}
关于java - 在没有 Maven 或 ANT 的情况下以编程方式将 WsImport 与 JAXB 插件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46550756/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!