You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:27:24