我正在使用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插件(例如thisthis):
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调用上设置了类路径?



基于注释:这是我的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文件。







仅调用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



再次是您可以在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);
    }
}

关于java - 在没有Maven或ANT的情况下以编程方式将WsImport与JAXB插件一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46550756/

10-10 09:10