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

升级至Java 17后Maven构建测试加载PKCS12密钥库失败

问题原因
  • 核心触发点是Java 17收紧了NIO路径的合法性校验:Java 8对jar协议URL的路径格式校验宽松,允许Windows盘符冒号、反斜杠这类特殊字符直接出现在路径字符串中;Java 17严格遵循URI规范,路径中出现未转义的冒号、不符合规范的反斜杠时会直接抛出Illegal char <:>错误。
  • IDEA和Maven运行测试的类路径差异导致表现不一致:IDEA运行测试时直接将target/classes、target/test-classes这类文件系统目录作为类路径根,加载keystore时走本地文件系统路径,不会生成jar协议的资源URL,因此不触发校验错误。Maven运行测试时,若类路径优先加载了已打包的Spring Boot可执行jar,keystore会被识别为jar包内资源,生成类似jar:file:\C:\xxx.jar!\ssl/localhost.p12的非规范URL,直接命中Java 17的路径校验规则。
  • 旧版本Spring Boot、Maven Surefire插件的路径拼接逻辑未适配Java 17:会直接拼接Windows本地路径到jar协议URL中,未对特殊字符做URI转义,进一步放大了兼容性问题。应用本身java -jar启动时走Spring Boot自定义的JarFile资源加载逻辑,不会调用JDK原生的NIO路径解析方法,因此运行不受影响。
解决方法

按落地成本从低到高排序:

  1. 升级插件与依赖版本
    • 将Maven Surefire插件升级到3.0.0及以上版本,修复插件本身在Windows下拼接jar路径时错误使用反斜杠的问题。
    • 将Spring Boot版本升级到2.7.12+或3.x版本,官方已经修复了classpath资源加载时jar路径未转义的兼容性问题,适配Java 17的路径校验规则。
  2. 调整Maven打包执行时机
    检查pom.xml中spring-boot-maven-plugin的执行绑定阶段,确保repackage目标绑定在package阶段,不要提前到test阶段之前执行,保证测试运行时类路径中没有打包好的可执行jar,所有资源都从文件系统目录加载,避免生成jar协议资源URL。
  3. 测试环境手动加载密钥库(兼容所有版本)
    如果暂时无法升级依赖,可以在测试目录下添加专属SSL配置,直接通过输入流加载keystore,绕过路径解析逻辑,示例代码如下:
    @TestConfiguration
    public class TestSslConfiguration {
        @Bean
        public WebServerFactoryCustomizer<TomcatServletWebServerFactory> sslCustomizer() throws Exception {
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            try (InputStream keystoreStream = getClass().getResourceAsStream("/ssl/localhost.p12")) {
                keyStore.load(keystoreStream, "localhost_ssl".toCharArray());
            }
            return factory -> {
                Ssl ssl = new Ssl();
                ssl.setEnabled(true);
                ssl.setKeyStore(keyStore);
                ssl.setKeyAlias("localhost_ssl");
                factory.setSsl(ssl);
            };
        }
    }
    
    在集成测试类上通过@Import(TestSslConfiguration.class)导入该配置即可,该方式不依赖路径字符串解析,在所有Java版本、所有运行场景下都能稳定工作。

内容的提问来源于stack exchange,提问作者Babyburger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:54:25