Programmatically use WsImport with JAXB plugins without Maven or ANT?

前端 未结 2 1977
太阳男子
太阳男子 2021-01-17 15:07

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

相关标签:
2条回答
  • 2021-01-17 15:38

    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" to make sure classpath is set on WSImport call?

    Edit

    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>
    

    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
    

    Just call Ant's default target and you will get proper java files.

    Edit 2 to support command line/programmatic call.

    .

    Option 1:

    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
    

    Option 2

    Call via custom class.

    Java class:

    package test;
    
    import com.sun.tools.ws.WsImport;
    
    public class Test
    {
        public static void main(String args []) throws Throwable
        {
            WsImport.doMain(args); 
        }
    }
    

    Command prompt call

    "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

    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); 
        }
    }
    
    0 讨论(0)
  • 2021-01-17 15:40

    I am at the same deadlock as the author of the thread trying to tweak gradle's Java source code generation from wsdl.

    And the reason for that is jaxb2-basics implements com.sun.tools.xjc.Plugin and @Optional in his answer refers to com.sun.tools.ws.WsImport. At the same time wsimport utility of "modern" Jdk8 rather implements com.sun.tools.internal.ws.WsImport and use com.sun.tools.internal.xjc.Plugin. So jaxb2-basics become kind of obsolete for using with wsimport of Jdk8.

    The solution would be to use alternative library to provide WsImport in "old" namespace. E.g. com.sun.xml.ws:jaxws-tools:2.3.0. In Gradle it looks like:

    configurations {
      jaxws
    }
    
    dependencies {
      jaxws 'org.jvnet.jaxb2_commons:jaxb2-basics:0.11.1'
      jaxws 'com.sun.xml.ws:jaxws-tools:2.3.0'
    
      compile 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime:0.11.1'
    }
    
    wsdlServices.each { u ->
      task "ws${u.service}" (type: JavaExec) {
        classpath = configurations.jaxws
    
        workingDir = generatedDir
        main = 'com.sun.tools.ws.WsImport'
        args = ['-keep', '-Xnocompile', '-B-XtoString', '-B-Xequals', '-B-XhashCode', u.url]
    
        compileJava.dependsOn path // depends on current task
      }
    }
    

    and in command line this will be:

    java -cp "lib/*" com.sun.tools.ws.WsImport -extension -keep -Xnocompile -B-XtoString 'http://www.webservicex.com/globalweather.asmx?WSDL'
    

    where lib contains

    commons-beanutils-1.9.2.jar
    commons-collections-3.2.1.jar
    commons-lang3-3.2.1.jar
    FastInfoset-1.2.13.jar
    gmbal-api-only-3.1.0-b001.jar
    ha-api-3.1.9.jar
    javaparser-1.0.11.jar
    javax.annotation-api-1.3.jar
    javax.xml.soap-api-1.4.0.jar
    jaxb2-basics-0.11.1.jar
    jaxb2-basics-runtime-0.11.1.jar
    jaxb2-basics-tools-0.11.1.jar
    jaxb-api-2.3.0.jar
    jaxb-core-2.3.0.jar
    jaxb-impl-2.3.0.jar
    jaxb-jxc-2.3.0.jar
    jaxb-xjc-2.3.0.jar
    jaxws-api-2.3.0.jar
    jaxws-rt-2.3.0.jar
    jaxws-tools-2.3.0.jar
    jcl-over-slf4j-1.7.7.jar
    jsr181-api-1.0-MR1.jar
    management-api-3.0.0-b012.jar
    mimepull-1.9.7.jar
    policy-2.7.2.jar
    resolver-20050927.jar
    saaj-impl-1.4.0.jar
    slf4j-api-1.7.7.jar
    stax-ex-1.7.8.jar
    streambuffer-1.5.4.jar
    

    i.e. org.jvnet.jaxb2_commons:jaxb2-basics:0.11.1 and com.sun.xml.ws:jaxws-tools:2.3.0 with dependencies

    0 讨论(0)
提交回复
热议问题