Alpine Linux Docker镜像安装Oracle JDK8与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参数,会自动遍历这些路径找到需要的头文件,后续的make和make install就能顺利完成了。
额外验证
编译完成后,你可以通过以下命令确认Tomcat Native是否正常加载:
catalina.sh configtest 2>&1 | grep 'Apache Tomcat Native'
如果输出包含INFO: Loaded APR based Apache Tomcat Native library,说明安装成功。
内容的提问来源于stack exchange,提问作者junzy




