JDK 17 中为何移除了 wsgen 工具?替代方案详解

发布时间 - 2026-01-27 00:00:00    点击率:

jdk 17 已彻底移除 `wsgen` 和 `wsimport` 等 jax-ws 工具,因其所属的 `jdk.xml.ws` 模块随 jep 320 在 java 11 中

被弃用并最终删除;现代 web 服务开发应转向 maven 插件或独立库实现 wsdl 代码生成与构建。

自 Java 11 起,Oracle 依据 JEP 320 将包括 java.xml.ws(JAX-WS)、java.xml.bind(JAXB)在内的 9 个 EE 相关模块从 JDK 标准库中正式移除。这意味着:

  • wsgen.exe(用于从 Java 类生成 WSDL)和 wsimport.exe(用于从 WSDL 生成客户端 stub)不再随 JDK 17 分发;
  • bin/ 目录下确实不再包含这两个可执行文件,即使你同时安装了 JDK 8 —— 这是设计使然,而非安装异常。

推荐替代方案:使用 jaxws-maven-plugin
该插件由 MojoHaus 维护,功能完整、兼容 JDK 11+,支持 wsgen 和 wsimport 的全部核心能力。在 pom.xml 中添加如下配置即可:


  
    
      org.codehaus.mojo
      jaxws-maven-plugin
      2.6.2
      
        
          generate-wsdl
          generate-sources
          
            wsgen
          
          
            ${project.build.directory}/generated-sources/wsgen
            com.example.MyWebService
            true
          
        
      
    
  

⚠️ 注意事项:

  • 插件需显式声明依赖 javax.jws:javax.jws-api(API)和 com.sun.xml.ws:jaxws-rt(运行时),尤其在 JDK 17+ 中不可省略;
  • 若项目仍需 JAXB 支持(如 WSDL 解析),请额外引入 jakarta.xml.bind:jakarta.xml.bind-api 和 org.glassfish.jaxb:jaxb-runtime;
  • 避免混用 JDK 8 的 wsgen 脚本与 JDK 17 编译环境——字节码版本不兼容可能导致 UnsupportedClassVersionError。

? 总结:wsgen 的消失标志着 Java 平台向模块化与轻量化的演进。与其回退至旧版 JDK,不如拥抱标准化构建流程:通过 Maven 插件实现可重复、可迁移的 Web Service 代码生成,既符合 Jakarta EE 规范演进方向,也更利于 CI/CD 集成与长期维护。


# oracle  # java  # go  # 字节  # 工具  # 标准库 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何在腾讯云服务器上快速搭建个人网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  韩国服务器如何优化跨境访问实现高效连接?  网站制作免费,什么网站能看正片电影?  JavaScript如何实现错误处理_try...catch如何捕获异常?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何快速上传自定义模板至建站之星?  浅谈javascript alert和confirm的美化  Android滚轮选择时间控件使用详解  Firefox Developer Edition开发者版本入口  如何用虚拟主机快速搭建网站?详细步骤解析  详解Android——蓝牙技术 带你实现终端间数据传输  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  javascript中的try catch异常捕获机制用法分析  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在万网自助建站平台快速创建网站?  iOS UIView常见属性方法小结  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel中的withCount方法怎么高效统计关联模型数量  如何快速搭建自助建站会员专属系统?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何利用DOS批处理实现定时关机操作详解  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Swift中switch语句区间和元组模式匹配  如何快速使用云服务器搭建个人网站?  如何在云服务器上快速搭建个人网站?  iOS中将个别页面强制横屏其他页面竖屏  Swift开发中switch语句值绑定模式  如何在阿里云虚拟主机上快速搭建个人网站?  Python图片处理进阶教程_Pillow滤镜与图像增强  Android利用动画实现背景逐渐变暗  如何快速完成中国万网建站详细流程?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何用AI帮你把自己的生活经历写成一个有趣的故事?  如何挑选最适合建站的高性能VPS主机?  Python并发异常传播_错误处理解析【教程】  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel如何处理和验证JSON类型的数据库字段