【问题标题】:generating classes from wsdl in java 11在 java 11 中从 wsdl 生成类
【发布时间】:2019-08-12 11:26:52
【问题描述】:

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

我使用的是 wsimport seeber 插件,但它看起来在 java 11 中不起作用

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

在 Intelij Idea 中我得到:

  • 出了什么问题:配置项目“:ReturnRedirectWorker-api”时出现问题。

    执行模型规则时抛出异常:WsimportPlugin.PluginRules#createWsdlSourceSets(ModelMap, 文件操作)> 创建(wsdlMain)> 创建(wsdl) 无法创建 WsdlSourceSet 类型的 LanguageSourceSet

【问题讨论】:

    标签: java gradle wsdl java-11


    【解决方案1】:

    Wsinport 和 wsgen 工具已从 Java 11 - 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 task轻松生成

    // 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 中测试。

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

    【讨论】:

    • 这种方法的问题是,当我想在编译之前运行生成(因为我的代码取决于生成的代码)我添加:compileJava.dependsOn wsimportCovercard 并且我得到:以下任务之间的循环依赖: :classes \--- :compileJava \--- :wsimport \--- :classes (*)
    • 一些调整: 1. 你需要jaxws-tools,而不是jaxws-rt,作为依赖。 2. 最好为你的任务创建一个单独的配置,在那里声明依赖,不要弄乱你的应用程序的类路径:configurations { wsImport } ... task wsImport(type: JavaExec) { classpath configurations.wsImport.files ...}
    • 你可以在这里找到 wsimport 语法:eclipse-ee4j.github.io/metro-jax-ws/3.0.0/docs/…
    • 不应该 gradle 任务定义它们的输入和输出吗?您将如何使用 wsimport 执行此操作? JavaExec 任务是否会以某种方式自动为您解决这些问题?
    【解决方案2】:

    您可以尝试为 Gradle wsdl2java 使用新插件。使用和配置简单,只需添加插件即可:

    plugins {
        ...
        id 'com.github.bjornvester.wsdl2java' version '1.2'
    }
    
    ...
    
    wsdl2java {
        includes = ['wsdl/test.wsdl']
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多