- 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/
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!