JDK10升级后解决NoClassDefFoundError:javax/xml/ws/Service异常

需积分: 36 15 下载量 57 浏览量 更新于2024-08-05 收藏 944B TXT 举报
"Java应用程序在升级到JDK 10后遇到了`java.lang.NoClassDefFoundError: javax/xml/ws/Service`错误,这通常是因为新版本的JDK移除了某些内置的API,如Web服务相关的包。解决方案是通过引入额外的依赖来提供这些缺失的类。以下是针对该问题的解决步骤和相关知识点的详细说明。" 在Java开发中,`NoClassDefFoundError`是一个常见的运行时异常,它表示在类加载时找不到指定的类定义。在本案例中,错误表明在执行过程中尝试加载`javax.xml.ws.Service`类失败,这通常发生在程序编译时存在所需的类,但在运行时环境无法找到的情况。 JDK 10开始,Oracle对Java的标准库进行了重大调整,其中就包括移除了一些早期的Java EE模块,比如JAX-WS(Java API for XML Web Services)。JAX-WS是用于创建Web服务客户端和服务端的重要工具,而`javax.xml.ws.Service`类是其核心部分,用于生成Web服务客户端代理。 为了解决这个问题,我们需要在项目中添加相应的依赖库,以恢复缺失的功能。以下是描述中提供的依赖列表,它们对应于JAX-WS和相关API的不同组件: 1. `javax.activation-api`: 这个依赖提供了数据激活API,用于处理数据对象的创建和识别。 2. `jaxb-api`: Java Architecture for XML Binding (JAXB) 的API,用于XML与Java对象之间的绑定,使得XML数据可以被Java代码处理,反之亦然。 3. `jaxb-core`和`jaxb-impl`: 这两个是JAXB的实现,提供实际的转换功能。 4. `jakarta.xml.ws-api`: Jakarta XML Web Services API,包含了JAX-WS的接口定义。 5. `jaxws-rt`: JAX-WS的运行时组件,包含了实现JAX-WS所需的服务端和客户端运行时库。 将这些依赖加入到Maven或Gradle的pom.xml或build.gradle文件中,确保在运行时环境能够找到必要的类。在Maven项目中,将上述依赖添加到`<dependencies>`标签内;对于Gradle项目,添加到`dependencies`块中。 通过引入这些外部依赖,我们可以恢复JDK 10之后不再包含的Web服务相关功能,从而解决`NoClassDefFoundError`。不过,要注意的是,随着Java平台的发展,一些旧的API会被移除或替换,因此在升级JDK版本时,及时检查并更新项目的依赖是必要的。同时,考虑将代码迁移到更现代的Web服务技术,如JAX-RS(Java API for RESTful Web Services)和Spring Web服务,也是一个长期的优化策略。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.xml.ws.Endpoint]: Factory method 'endpoint' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/cxf/frontend/ServerFactoryBean at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE] ... 19 common frames omitted Caused by: java.lang.NoClassDefFoundError: org/apache/cxf/frontend/ServerFactoryBean at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_301] at java.lang.ClassLoader.defineClass(ClassLoader.java:756) ~[na:1.8.0_301] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_301] at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) ~[na:1.8.0_301] at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[na:1.8.0_301] at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[na:1.8.0_301] at java.net.URLClassLoader$1.run(URLClassLoader.java:363) ~[na:1.8.0_301] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_301] at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[na:1.8.0_301] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_301] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_301] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_301] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:164) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:157) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:171) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:178) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]

2023-06-07 上传