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

Spring Boot 2.7.3自定义CharsetProvider在Java17下无法加载求助

解决Java 17下自定义CharsetProvider无法加载的问题

Java 17的模块系统(JPMS)对服务加载的规则比Java 11更严格,结合Spring Boot的fat jar机制,需要从以下几个方面调整:

1. 确保服务配置文件正确合并

Maven Shade插件的ServicesResourceTransformer负责合并META-INF/services下的服务声明文件,Java 17会严格校验这个文件的存在性和格式。检查你的Shade插件配置,确保包含该Transformer:

<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来合并服务声明 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <!-- Spring Boot fat jar所需的Transformer -->
                    <transformer implementation="org.springframework.boot.maven.ShadeResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

打包后解压JAR,确认META-INF/services/java.nio.charset.spi.CharsetProvider文件存在,且内容包含你的自定义Provider全类名(比如com.your.package.YourCustomCharsetProvider)。

2. 适配模块系统(如果是模块化项目)

如果你的项目已经启用了JPMS(存在module-info.java),需要在模块声明中明确服务提供关系:

module com.your.module {
    // 导出Provider所在包(若需外部访问)
    exports com.your.package.charset;
    // 声明提供CharsetProvider服务
    provides java.nio.charset.spi.CharsetProvider with com.your.package.charset.YourCustomCharsetProvider;
    // 依赖java.base模块(CharsetProvider属于该模块)
    requires java.base;
}

3. 调整JVM启动参数(针对Spring Boot fat jar)

Java 17对模块的访问权限控制更严格,若自定义Provider在未命名模块中,可添加以下启动参数解除限制:

--add-opens java.base/java.nio.charset.spi=ALL-UNNAMED

如果是模块化项目,将ALL-UNNAMED替换为你的模块名称。

4. 验证Provider类的可访问性

确保自定义CharsetProvider类是public的,且无初始化异常。可以在Provider的构造方法中添加日志输出,启动时检查是否被实例化,排查是否是类加载失败而非服务注册问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:50:17