SpringBoot集成Apache Ignite部署至Tomcat启动失败问题
Apache Ignite部署Tomcat启动异常解决方案
问题场景
开发基于Spring Boot+Apache Ignite的API时,IDE内运行正常,Ignite缓存启动无问题;但将war包部署到Tomcat后,调用API端点启动Ignite节点时抛出初始化异常。
环境配置
pom.xml核心依赖
<properties> <java.version>17</java.version> <ignite.version>2.14.0</ignite.version> <h2.version>1.4.197</h2.version> </properties> <dependencies> <!-- 支持Tomcat部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-core</artifactId> <version>${ignite.version}</version> </dependency> <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-spring</artifactId> <version>${ignite.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
Ignite启动代码
Ignition.start()
核心报错日志
2023-05-18T10:17:23.483-04:00 ERROR 2540 --- [nio-8080-exec-6] o.s.b.w.servlet.support.ErrorPageFilter : Forwarding to error page from request [/test] due to exception [null] java.lang.ExceptionInInitializerError: null at org.apache.ignite.internal.util.IgniteUtils.<clinit>(IgniteUtils.java:888) ~[ignite-core-2.14.0.jar:2.14.0] ... Caused by: java.lang.RuntimeException: java.nio.DirectByteBuffer.address field is unavailable. at org.apache.ignite.internal.util.GridUnsafe$2.run(GridUnsafe.java:1570) ~[ignite-core-2.14.0.jar:2.14.0] ... 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 @34967d5f at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na] ...
解决方案
方案1:添加Tomcat JVM启动参数
异常根源是Java 17模块系统限制了Ignite对java.nio.Buffer内部字段的访问,需给Tomcat添加以下JVM参数开放权限:
--add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED
- Windows系统:修改Tomcat的
bin\catalina.bat,在set JAVA_OPTS=后追加上述参数; - Linux系统:修改
bin/catalina.sh,在JAVA_OPTS=后追加参数。
方案2:升级Apache Ignite版本
Ignite 2.14.0对Java 17的模块兼容性存在问题,升级到2.15.0及以上版本可修复该权限问题。修改pom.xml版本配置:
<ignite.version>2.15.0</ignite.version>
同步升级Spring Boot自动配置扩展包到兼容版本:
<dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId> <version>1.1.0</version> </dependency>
方案3:调整Ignite启动时机
避免在Web请求线程中启动Ignite节点,改为在应用初始化阶段启动,符合最佳实践:
import org.apache.ignite.Ignition; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; @Component public class IgniteInitializer { @PostConstruct public void startIgnite() { Ignition.start(); } }
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

