gradle wsimport

3

我正在使用命令行运行wsimport,从WSDL生成Java类,如下所示。

wsimport -J-Djavax.xml.accessExternalDTD=all 
         -J-D-Djavax.xml.accessExternalSchema=all 
         -b http://www.w3.org/2001/XMLSchema.xsd 
         -b customization.xjb 
         -s genSrc https://example.com/XYZ.asmx?wsdl

我想创建相应的Gradle任务。由于公司限制,我不应该使用任何随意的自定义Gradle插件。如何最好地处理?

4个回答

7

正如@lunicon所提到的,您应该使用ant任务,这里有一些改进,因为gradle已更改了一些属性。

configurations {
    jaxws
}

dependencies {
    jaxws 'com.sun.xml.ws:jaxws-tools:2.1.4'
}

task wsimport {
    ext.destDir = file("${projectDir}/src/main/generated")
    doLast {
        ant {
            sourceSets.main.output.classesDirs.inits()
            destDir.mkdirs()
            taskdef(name: 'wsimport',
                    classname: 'com.sun.tools.ws.ant.WsImport',
                    classpath: configurations.jaxws.asPath
            )
            wsimport(keep: true,
                    sourcedestdir: 'src/main/java',
                    package: "com.example.client.api",
                    wsdl: 'src/main/resources/api.wsdl') {
                xjcarg(value: "-XautoNameResolution")
            }
        }
    }
}

compileJava {
    dependsOn wsimport
    source wsimport.destDir
}

wsimport任务属性列表(我正在寻找类似于这个问题中的编码方式) - undefined

4

在网上找到了使用ant任务的信息。 更多细节请参考metro项目网站

configurations {
    jaxws
}

dependencies {
    jaxws 'com.sun.xml.ws:jaxws-tools:2.1.4'
}

task wsimport {
    ext.destDir = file("${projectDir}/src/main/generated")
    doLast {
        ant {
            sourceSets.main.output.classesDir.mkdirs()
            destDir.mkdirs()
            taskdef(name: 'wsimport',
                    classname: 'com.sun.tools.ws.ant.WsImport',
                    classpath: configurations.jaxws.asPath
            )
            wsimport(keep: true,
                    destdir: sourceSets.main.output.classesDir,
                    sourcedestdir: destDir,
                    extension: "true",
                    verbose: "false",
                    quiet: "false",
                    package: "com.example.client.api",
                    xnocompile: "true",
                    wsdl: 'src/main/resources/api.wsdl') {
                xjcarg(value: "-XautoNameResolution")
            }
        }
    }
}

compileJava {
    dependsOn wsimport
    source wsimport.destDir
}

2
有一种更简洁的选择,无需使用ant,只需直接调用WsImport类作为gradle java任务。请参考我在类似问题上的回答:https://dev59.com/lrXna4cB1Zd3GeqPOqmi#61090230 - undefined

1

这是 Kotlin DSL 中的等效内容

dependencies {
    jaxws("com.sun.xml.ws:jaxws-tools:2.3.5")
    jaxws("jakarta.xml.ws:jakarta.xml.ws-api:2.3.3")
    jaxws("jakarta.activation:jakarta.activation-api:2.1.0")
    jaxws("jakarta.xml.bind:jakarta.xml.bind-api:2.3.3")
}

tasks.register("wsimport") {
    val destDir by extra("${buildDir}/generated/main/java")

    doLast {
        ant.withGroovyBuilder {
            mkdir(destDir)
            "taskdef"(
                "name" to "wsimport",
                "classname" to "com.sun.tools.ws.ant.WsImport",
                "classpath" to configurations["jaxws"].asPath
            )
            "wsimport"(
                "keep" to true,
                "sourcedestdir" to destDir,
                "wsdl" to "${projectDir}/some-api.wsdl",
                "verbose" to true
            ) {
                "xjcarg"("value" to "-XautoNameResolution")
            }
        }
    }
}

tasks.compileJava {
    dependsOn(tasks["wsimport"])
    val destDir: String by tasks["wsimport"].extra
    source(destDir)
}

0
configurations {
    jaxws
}

dependencies {
    jaxws 'com.sun.xml.ws:jaxws-tools:2.1.4'
}

task wsimport {
    ext.destDir = file("${projectDir}/src/main/generated")
    doLast {
        ant {
            destDir.mkdirs()
            taskdef(name: 'wsimport',
                    classname: 'com.sun.tools.ws.ant.WsImport',
                    classpath: configurations.jaxws.asPath
            )
            wsimport(keep: true,
                    destdir: sourceSets.main.output.classesDir,
                    sourcedestdir: destDir,
                    extension: "true",
                    verbose: "false",
                    quiet: "false",
                    package: "com.example.client.api",
                    xnocompile: "true",
                    wsdl: 'c:/projects/gluecode/src/main/resources/api.wsdl') {
                xjcarg(value: "-XautoNameResolution")
            }
        }
    }
}

这个例子是从另一个问题的答案中复制过来的,但删除了一行代码 "sourceSets.main.output.classesDir.mkdirs()" 并添加了 .wsdl 文件的绝对路径。

要在 Gradle 中运行该任务,请按照以下步骤进行:

  1. 进入运行配置并创建新的配置。
  2. 从配置中选择列表侧的 Gradle 项目或 Gradle 任务 如下截图所示
  1. 任务名称应与 .gradle 文件中提供的任务 <<Task_Name>> {} 相同。
  2. 从运行配置中运行任务,然后检查控制台日志。在控制台日志中,一些依赖项从 Gradle 存储库中下载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接