在Java 11中从WSDL生成类

3

如何使用gradle 5在Java 11中从WSDL生成类?

我之前使用过wsimport插件,但是似乎在Java 11中无法使用。

dependencies {
            classpath "gradle.plugin.me.seeber.gradle:gradle-wsimport-plugin:1.1.1"
}

在Intelij Idea中我遇到了如下问题:
``` What went wrong: A problem occurred configuring project ':ReturnRedirectWorker-api'. Exception thrown while executing model rule: WsimportPlugin.PluginRules#createWsdlSourceSets(ModelMap, FileOperations) > create(wsdlMain) > create(wsdl) Could not create LanguageSourceSet of type WsdlSourceSet ```
2个回答

8

Java 11移除了Wsinport和wsgen工具- JEP 320,但它们可以在Metro JAX-WS中找到,该工具现在是EE4J initiative的一部分。

wsimport这样的命令行工具本质上只是一个调用Java类com.sun.tools.ws.WsImport的包装器。此类包含在Metro JAX-WS中(可在maven构件jaxws-rtjaxws-tools或其他构件中获得)。

可以直接从Java生成类

// SomeClass.java
String[] args = new String[]{
    "-target", "2.1",
    "-s", "src/main/java",
    "-keep",
    "-Xnocompile",
    "-extension",
    "-encoding", "UTF-8",
    "-wsdllocation", "http://localhost/wsdl",
    "src/main/resources/META-INF/SomeService.wsdl"
};
com.sun.tools.ws.WsImport.main(args);

或者可以通过Gradle任务轻松生成:

// build.gradle
task wsImport(type: JavaExec) {
    classpath sourceSets.main.runtimeClasspath
    main = "com.sun.tools.ws.WsImport"
    args "-target", "2.1",
        "-s", "src/main/java",
        "-keep",
        "-Xnocompile",
        "-extension",
        "-encoding", "UTF-8",
        "-wsdllocation", "http://localhost/wsdl",
        "src/main/resources/META-INF/SomeService.wsdl"
}

dependencies {
    compile 'com.sun.xml.ws:jaxws-rt:2.3.2-1'
}

已在Java 13和Gradle 6中进行测试。

最好的部分是,除了“原始”的依赖项之外,没有额外的插件或花哨的依赖项。


2
我对这种方法的问题在于,当我想在编译之前运行生成(因为我的代码依赖于生成的代码)时,我会添加: compileJava.dependsOn wsimportCovercard 然后我得到了以下结果: 以下任务之间存在循环依赖关系: :classes --- :compileJava --- :wsimport --- :classes (*) - user1928596
3
需要进行一些微调:
  1. 作为依赖项,您需要使用jaxws-tools,而不是jaxws-rt
  2. 最好为您的任务创建单独的配置文件,在那里声明依赖项,并且不要将其混杂在应用程序类路径中: configurations { wsImport } ... task wsImport(type: JavaExec) { classpath configurations.wsImport.files ...}
- Andrew Lygin
您可以在此处找到wsimport语法:https://eclipse-ee4j.github.io/metro-jax-ws/3.0.0/docs/ch04.html#wsimport-syntax - gouessej
Gradle任务不应该定义它们的输入和输出吗?你会如何使用wsimport实现这一点?JavaExec任务是否会自动为您处理这个问题? - bdrx
在Gradle依赖项中添加: dependencies { implementation 'com.sun.xml.ws:jaxws-tools:2.1.4' } - Sfp

1

您可以尝试使用适用于Gradle的新插件wsdl2java。它易于使用和配置,您只需添加插件即可:

plugins {
    ...
    id 'com.github.bjornvester.wsdl2java' version '1.2'
}

...

wsdl2java {
    includes = ['wsdl/test.wsdl']
}

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