Java 21中JAXP09020005错误:classpath前缀无效的修复咨询
Java 21下JAXP09020005错误(classpath协议不识别)修复方案
问题背景
项目基于jakarta.xml.ws.Provider 4.0.2,自动选用com.sun.xml.ws.spi.ProviderImpl(关联com.sun.xml:jaxws-rt 4.0.3)作为服务提供者。运行时jaxws-rt的XmlCatalogUtil会读取Apache CXF 2.7.18的META-INF/jax-ws-catalog.xml,其中rewritePrefix="classpath:/schemas/wsdl",但Java 21无法识别classpath协议,抛出MalformedURLException触发JAXP09020005错误,且无法直接替换jaxws-rt库,可用以下方案修复:
方案1:自定义URL协议处理器识别classpath
自己实现URL处理器,让Java能解析classpath协议:
- 编写处理器类:
public class ClasspathURLHandler extends URLStreamHandler { @Override protected URLConnection openConnection(URL u) throws IOException { String path = u.getPath().replaceFirst("^/", ""); URL resource = Thread.currentThread().getContextClassLoader().getResource(path); if (resource == null) { throw new FileNotFoundException("找不到classpath资源: " + path); } return resource.openConnection(); } }
- 注册处理器,二选一:
- 代码注册:在应用启动类的静态块中添加:
static { URL.setURLStreamHandlerFactory(protocol -> "classpath".equals(protocol) ? new ClasspathURLHandler() : null); }
- JVM参数注册:启动应用时添加参数
-Djava.protocol.handler.pkgs=你的处理器所在包名(多包用|分隔)
方案2:修改jax-ws-catalog.xml的rewritePrefix路径
如果能修改CXF库中的META-INF/jax-ws-catalog.xml,把classpath:/schemas/wsdl替换为实际的文件系统绝对路径,示例:
<rewriteRule matchPrefix="http://example.com/schemas/" rewritePrefix="file:/你的项目资源绝对路径/schemas/wsdl/"/>
也可以在打包时将schemas目录复制到固定位置,用该位置的绝对路径。
方案3:打包时替换CXF库中的jax-ws-catalog.xml
用构建插件在打包阶段修改CXF包内的配置文件,无需改动原库:
- Maven使用
maven-shade-plugin示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals><goal>shade</goal></goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ReplaceTransformer"> <resource>META-INF/jax-ws-catalog.xml</resource> <replace>rewritePrefix="classpath:/schemas/wsdl"</replace> <with>rewritePrefix="file:/你的资源绝对路径/schemas/wsdl"</with> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
- Gradle可使用shadow插件,通过
transform配置实现相同的文件内容替换逻辑。
方案4:升级CXF到Java 21兼容版本
将Apache CXF从2.7.18升级到3.6.x及以上版本,新版本已适配Java 21,能正确处理classpath协议或修复了相关配置问题,无需替换jaxws-rt即可解决报错。
内容的提问来源于stack exchange,提问作者F Goli
相关产品推荐
相关产品推荐

