在没有 Maven 或 ANT 的情况下以编程方式将 WsImport 与 JAXB 插件结合使用?

2023-11-22

我在用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 and 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 调用上设置类路径?

Edit

基于评论:这是我的 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

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

选项2c

再次是一个自定义的 java 类/方法,您可以在 scala 中使用它。确保您已使用我列出的 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); 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在没有 Maven 或 ANT 的情况下以编程方式将 WsImport 与 JAXB 插件结合使用? 的相关文章

随机推荐

  • 如何解决“资源”参数中的“重复项目”错误

    在处理我的项目时 我遇到了以下错误 在 资源 参数中多次指定了 项 资源 参数不支持重复项目 删除了项目名称 没关系 但是 我不知道如何解决这个问题 在 Visual C Express 中哪里可以找到此参数 我猜 项是一种形式 那么 从最
  • 替换部分超链接

    我需要修改 xls 工作簿中的大量超链接 我的链接是这样的 mysrv001 some path documents doc我需要更换 mysrv001 with mysrv002 我尝试了类似的操作 但收到错误 对象不支持此属性或方法 我
  • 如何使用 Python 图像库 (PIL) 识别非照片或“无趣”图像

    我有数千张图像 我需要剔除那些不是照片或其他 有趣 的图像 例如 无趣 的图像可能全部是一种颜色 或者大部分是一种颜色 或者是简单的图标 徽标 该解决方案不必是完美的 只要足以删除最不有趣的图像即可 到目前为止 我最好的想法是对像素进行随机
  • 匹配多种类型以实现模板专业化解析

    简单地忽略一个事实 即正常的函数重载将更好地服务于这个示例 它只是作为学习模板编程的一种方式 话虽如此 欢迎您评论与函数模板专业化相比 使用函数重载所获得的好处 差异 尽管这可能值得一个自己的问题 考虑以下示例 template
  • 使用 HTML Agility Pack 和 Linq 解析 html

    我有以下 HTML tbody tr td class name Test1 td td class data Data td td class data2 Data 2 td tr tr td class name Test2 td td
  • 使 Console.WriteLine() 换行单词而不是字母

    Using Console WriteLine 它输出 我希望它自动看起来像这样 而不是手动输入 n任何需要的地方 这可能吗 如果是这样 怎么办 这是一个适用于制表符 换行符和其他空格的解决方案 using System using Sys
  • 对象内的 XMLHttpRequest:如何保留对“this”的引用

    我从 javascript 对象内部进行一些 Ajax 调用 myObject prototye ajax function this foo 1 var req new XMLHttpRequest req open GET url tr
  • 依赖注入 Slim 框架 3

    我正在使用 Slim Framework 3 创建 API 应用程序结构是 MVCP 模型 视图 控制器 提供者 是否可以对我的所有课程进行 Slim Dependency Inject 我正在使用 Composer 自动加载所有依赖项 我
  • KeyedByTypeCollection 在 .Net 中的用途?

    在检查 net 中的通用集合时 我发现了 KeyedByTypeCollection 虽然我使用过它并了解了如何使用它 但我不知道它在哪种场景下有用 我通读了ServiceProvider 缓存等使用泛型完成 无需强制转换 但拿不到太多 我
  • GWT 中需要取消绑定演示者

    我按照此处给出的示例使用 GWT 应用程序中的 MVP 模式http code google com webtoolkit doc latest tutorial mvp architecture html 对于 MainView 中的每个
  • jQuery - 获取 div 中图像的所有 src 并将其放入字段中

    我要修改本教程符合我的要求 但我有一个问题 我是 jQuery 的初学者 我想从特定的 div 获取所有图像源并将它们放入字段中 有一个变量images这是字段并包含一些图像 但我想代替这个从 div 获取所有图像源并将它们放入字段中ima
  • NHibernate 异常:方法 Add 应该是“公共/受保护的虚拟”或“受保护的内部虚拟”

    以这个类为例 public class Category PersistentObject
  • Python 按元素元组运算,如求和

    无论如何 Python 中的元组操作是否可以像这样工作 gt gt gt a 1 2 3 gt gt gt b 3 2 1 gt gt gt a b 4 4 4 代替 gt gt gt a 1 2 3 gt gt gt b 3 2 1 gt
  • 如何弯曲react-navigation-material-bottom-tabs的顶部两个角?

    我是本地反应新手 我正在使用反应导航 反应导航材料底部选项卡 我想做的就是弯曲底部选项卡栏的右上角和左上角 My Code const screen1 createMaterialBottomTabNavigator Home screen
  • Android - 对话框中的共享元素转换

    我想知道是否有任何方法可以在活动 片段和对话框之间使用共享元素 我有一个包含对话框的项目 我想在 Activity 视图层次结构中的 ImageView 到 GalleryDialog 中的相关 ImageView 之间进行转换 我搜索了一
  • 具有核心列表内容的动画页面的聚合物核心过渡

    继从这个问题我进一步发展了演示消息示例尝试使用核心列表在两个页面之间创建页面转换 我正在努力实现以下目标 每个页面上的 fab 上的英雄过渡 两个页面上的幻灯片过渡 方向相反 无论您在列表中滚动到何处 这都会按预期工作 请注意 单击 fab
  • 在 tel:// 链接中插入暂停

    我正在创建一个供 iOS 用户使用的 Web 应用程序 但数据库中的某些电话号码需要添加扩展名 有什么办法可以修改tel URL 方案是否包含暂停或等待 提前致谢 您可以使用 p 暂停 例如 电话 12345678 123 将 更改为 p
  • SaveFileDialog 上的 DialogResult.OK 不起作用

    我尝试 当我按下 保存 时SaveFileDialog我做某事 我尝试修复但总是出错 SaveFileDialog dlg2 new SaveFileDialog dlg2 Filter xml xml dlg2 DefaultExt xm
  • Oracle C# 中的参数化查询

    string sqlCmd SELECT r row id AS resp id r name AS resp name FROM srb s resp r srb s per resp pr srb s contact c srb s u
  • 在没有 Maven 或 ANT 的情况下以编程方式将 WsImport 与 JAXB 插件结合使用?

    我在用WsImport从远程 WSDL 文件生成一些 Java 源代码 请注意 这是来自常规 Scala 项目内部 即它不是在 Maven 或 Ant 构建中完成的 import com sun tools ws WsImport def