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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:22:01