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

升级Java11至17及Ignite2.15至2.17后JDBC瘦驱动启动异常

问题描述
  • Java版本从11升级至17,Ignite版本从2.15升级至2.17
  • 系统采用多租户模式连接PostgreSQL数据库,Ignite仅用作缓存
  • 升级完成后启动服务,遭遇Ignite JDBC瘦驱动相关初始化错误

初始启动错误

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1362)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1351)
at com.myapp.myIgniteApplication.main(myIgniteApplication.java:31)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.ignite.IgniteJdbcThinDriver
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:467)
    at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:558)
    at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:550)
    at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:451)
    at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:428)
    at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:60)
    at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:326)
    at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:112)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:93)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
    at org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl.getAnyConnection(AbstractDataSourceBasedMultiTenantConnectionProviderImpl.java:25)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$MultiTenantConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:343)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:152)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:34)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:119)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:264)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:239)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:216)
    at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:230)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:198)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:166)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1380)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1451)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1865)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1814)
    ... 14 common frames omitted
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.ExceptionInInitializerError [in thread "main"]
    at org.apache.ignite.internal.util.IgniteUtils.<clinit>(IgniteUtils.java:892)
    at org.apache.ignite.lang.IgniteProductVersion.fromString(IgniteProductVersion.java:312)
    at org.apache.ignite.internal.IgniteVersionUtils.<clinit>(IgniteVersionUtils.java:94)
    at org.apache.ignite.IgniteJdbcThinDriver.<clinit>(IgniteJdbcThinDriver.java:140)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at java.sql/java.sql.DriverManager$2.run(DriverManager.java:618)
    at java.sql/java.sql.DriverManager$2.run(DriverManager.java:598)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at java.sql/java.sql.DriverManager.ensureDriversInitialized(DriverManager.java:598)
    at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:426)
    ... 40 common frames omitted

尝试的解决方法

手动添加Ignite JDBC DataSource Bean:

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.apache.ignite.IgniteJdbcThinDriver");
    dataSource.setUrl("jdbc:ignite:thin://127.0.0.1:10800;");
    return dataSource;
}

新出现的错误

org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception with message: null
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:199)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:88)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:168)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
    ... 32 common frames omitted
Caused by: java.lang.ExceptionInInitializerError: null
    at org.apache.ignite.internal.util.IgniteUtils.<clinit>(IgniteUtils.java:892)
    at org.apache.ignite.lang.IgniteProductVersion.fromString(IgniteProductVersion.java:312)
    at org.apache.ignite.internal.IgniteVersionUtils.<clinit>(IgniteVersionUtils.java:94)
    at org.apache.ignite.IgniteJdbcThinDriver.<clinit>(IgniteJdbcThinDriver.java:140)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:467)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.setDriverClassName(DriverManagerDataSource.java:128)
    at com.myapp.config.IgniteConfig.dataSource(IgniteConfig.java:37)
    at com.myapp.config.IgniteConfig$$SpringCGLIB$$0.CGLIB$dataSource$0(<generated>)
    at com.myapp.config.IgniteConfig$$SpringCGLIB$$FastClass$$1.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:393)
    at com.myapp.config.IgniteConfig$$SpringCGLIB$$0.dataSource(<generated>)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:171)
    ... 35 common frames omitted
Caused by: java.lang.RuntimeException: java.nio.DirectByteBuffer.address field is unavailable.
    at org.apache.ignite.internal.util.GridUnsafe$2.run(GridUnsafe.java:1615)
    at org.apache.ignite.internal.util.GridUnsafe$2.run(GridUnsafe.java:1602)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at org.apache.ignite.internal.util.GridUnsafe.bufferAddressOffset(GridUnsafe.java:1602)
    at org.apache.ignite.internal.util.GridUnsafe.<clinit>(GridUnsafe.java:115)
    ... 53 common frames omitted
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field long java.nio.Buffer.address accessible: module java.base does not "opens java.nio" to unnamed module @4617c264
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
    at org.apache.ignite.internal.util.GridUnsafe$2.run(GridUnsafe.java:1607)
    ... 57 common frames omitted
解决方案

1. 添加JVM启动参数解决模块访问限制

Java 17的模块系统默认禁止访问内部API,Ignite的GridUnsafe类需要访问NIO相关的内部字段,因此需要添加以下JVM参数:

--add-opens java.base/java.nio=ALL-UNNAMED
--add-opens java.base/sun.nio.ch=ALL-UNNAMED

如果使用Spring Boot,可以在application.properties中配置:

spring.jvm.args=--add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED

也可以直接在启动脚本、IDE运行配置中添加这些参数。

2. 移除不必要的Ignite JDBC DataSource Bean

系统仅将Ignite用作缓存,无需配置Ignite的JDBC数据源。之前添加的dataSource() Bean会触发Ignite JDBC驱动的初始化,反而引发问题,直接删除该Bean即可。

3. 检查Ignite依赖配置

确保项目中Ignite的依赖版本统一为2.17,且仅引入必要的依赖:

  • 仅用缓存时,核心依赖为ignite-core
  • 若无需JDBC功能,可省略ignite-jdbc-thin依赖

示例Maven依赖:

<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-core</artifactId>
    <version>2.17.0</version>
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:45:53