You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Alpine Linux Docker镜像安装Oracle JDK8与Tomcat Native遇jni.h缺失错误

解决Alpine Docker中Tomcat Native编译时找不到jni.h的问题

我刚帮你排查了这个问题——你遇到的#include <jni.h> No such file or directory错误,核心原因是Oracle JDK的JNI头文件路径没有正确配置到JRE目录下,而且你之前移动头文件的步骤完全错了。

问题根源分析

你在Dockerfile里解压JDK后,只把jdk1.8.0_73/include/linux移动到了/jre/linux,但jni.h本身是在jdk1.8.0_73/include目录下的。Tomcat Native的编译脚本需要从$JAVA_HOME/include$JAVA_HOME/include/linux两个路径读取头文件,你没把主include目录复制到JRE里,自然找不到jni.h。

另外,你尝试添加的-I/$JAVA_HOME/参数也不对,因为头文件不在$JAVA_HOME根目录,而是在$JAVA_HOME/include里,但其实根本不需要手动加这个参数,只要头文件路径正确,./configure--with-java-home参数会自动识别。

修复步骤

修改Dockerfile中ADD JAVA部分的头文件复制逻辑,把整个include目录复制到JRE下,而不是只移动linux子目录:

# ADD JAVA
ENV JAVA_VERSION_MAJOR=8 \
 JAVA_VERSION_MINOR=73 \
 JAVA_VERSION_BUILD=02 \
 JAVA_PACKAGE=server-jre

RUN curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie" \
 "http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-b${JAVA_VERSION_BUILD}/${JAVA_PACKAGE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-linux-x64.tar.gz" | gunzip -c - | tar -xf - && \
 # 移动JRE目录到/jre
 mv jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR}/jre /jre && \
 # 关键修改:复制整个include目录到JRE的include路径下
 cp -r jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR}/include /jre/include && \
 # 以下清理步骤保持不变
 rm /jre/bin/keytool && \
 rm /jre/bin/orbd && \
 rm /jre/bin/pack200 && \
 rm /jre/bin/policytool && \
 rm /jre/bin/rmid && \
 rm /jre/bin/rmiregistry && \
 rm /jre/bin/servertool && \
 rm /jre/bin/tnameserv && \
 rm /jre/bin/unpack200 && \
 rm /jre/lib/jfr.jar && \
 rm -rf /jre/lib/jfr && \
 rm -rf /jre/lib/oblique-fonts && \
 rm -rf /tmp/* && \
 rm -rf /var/cache/* && \
 echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf

为什么这样能解决?

修改后,$JAVA_HOME/include(也就是/jre/include)下会有jni.h/jre/include/linux下会有平台相关的头文件,Tomcat Native的./configure脚本通过--with-java-home=$JAVA_HOME参数,会自动遍历这些路径找到需要的头文件,后续的makemake install就能顺利完成了。

额外验证

编译完成后,你可以通过以下命令确认Tomcat Native是否正常加载:

catalina.sh configtest 2>&1 | grep 'Apache Tomcat Native'

如果输出包含INFO: Loaded APR based Apache Tomcat Native library,说明安装成功。

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

火山引擎 最新活动