MiNiFi-0.5.0迁移至OpenJDK17镜像启动失败的解决求助
解决JDK17运行MiNiFi/NiFi时的InaccessibleObjectException问题
Dockerfile中配置MiNiFi-0.5.0的JVM参数
JDK9及以上版本的模块系统默认限制反射访问权限,MiNiFi-0.5.0这类旧版本依赖反射操作,因此需要添加--add-opens参数解除限制,以下是两种配置方式:
方式1:修改MiNiFi启动脚本
直接在Dockerfile中修改MiNiFi启动脚本里的JVM_OPTS变量,追加所需参数:
FROM openjdk:17-jdk # 复制MiNiFi程序文件到容器(替换为你实际的复制逻辑) COPY minifi-0.5.0 /opt/minifi # 向启动脚本的JVM_OPTS中追加参数 RUN sed -i 's/^JVM_OPTS="/JVM_OPTS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED /' /opt/minifi/bin/minifi.sh # 启动MiNiFi CMD ["/opt/minifi/bin/minifi.sh", "start-run"]
方式2:通过环境变量或直接指定启动命令
如果不想修改脚本,可通过环境变量传递JVM参数,或者直接用java命令启动:
FROM openjdk:17-jdk COPY minifi-0.5.0 /opt/minifi # 设置环境变量传递JVM参数 ENV JVM_OPTS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED" # 启动MiNiFi CMD ["sh", "-c", "/opt/minifi/bin/minifi.sh start-run"]
或者直接指定java命令启动(需确认bootstrap jar的实际路径):
CMD ["java", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--add-opens=java.base/java.util=ALL-UNNAMED", "-jar", "/opt/minifi/lib/minifi-bootstrap.jar"]
本地JDK17运行NiFi-1.8.0的解决方法
同样通过修改启动脚本或临时传递参数解决:
修改启动脚本
打开NiFi安装目录下的bin/nifi.sh,找到JVM_OPTS的定义处,修改为:
JVM_OPTS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED ${JVM_OPTS}"
临时启动传递参数
在终端启动NiFi时,临时设置环境变量传递参数:
JVM_OPTS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED" ./bin/nifi.sh start
注:连接拒绝错误通常是因为JVM启动失败导致服务未正常初始化,解决反射权限问题后,服务应该能正常启动监听端口。
内容的提问来源于stack exchange,提问作者Shashank Gupta
相关产品推荐
相关产品推荐

