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

Docker构建使用JNI的Go应用时提示jni.h不存在报错如何解决

问题修复方案

错误原因

构建阶段仅安装了OpenJDK的JRE运行包,JRE仅提供Java程序运行能力,不包含JNI开发所需的jni.h等头文件,同时未配置CGO的头文件搜索路径,导致编译时无法找到对应头文件。

修复步骤

  • 替换构建阶段的JDK安装包:将BUILD镜像中安装的openjdk8-jre替换为完整的openjdk8开发包,获取JNI开发所需头文件
  • 配置CGO环境变量:指定JNI头文件和库文件的搜索路径,让CGO编译器可以找到对应依赖
  • 补全运行阶段的JRE依赖:运行镜像中需要安装openjdk8-jre,保证应用运行时可以正常调用JNI相关逻辑
  • 修复原有Dockerfile的语法错误:FINAL阶段的apk安装命令中缺少&&连接符,会导致命令执行失败

修改后完整Dockerfile

FROM golang:alpine as BUILD

ENV GO111MODULE=auto
# 配置CGO头文件和库文件搜索路径,对应alpine中openjdk8的默认安装路径
ENV CGO_CFLAGS="-I/usr/lib/jvm/java-1.8-openjdk/include -I/usr/lib/jvm/java-1.8-openjdk/include/linux"
ENV CGO_LDFLAGS="-L/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server -ljvm"
ENV LD_LIBRARY_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server"

RUN apk update && \
    apk upgrade && \
    apk add git unzip openssl-dev build-base gcc musl-dev openjdk8

COPY . /go/src/project
WORKDIR /go/src/project

RUN go get -d -v

RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o /go/dist/app

FROM alpine:latest AS FINAL

COPY --from=BUILD /go/dist/app /project-runtime/app

RUN apk update && \
    apk add tzdata apr ca-certificates openssl openjdk8-jre && \
    rm -rf /var/cache/apk/*

RUN update-ca-certificates
# 运行时也需要配置库文件路径找到jvm库
ENV LD_LIBRARY_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server"

WORKDIR /project-runtime

ENTRYPOINT ["./app"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 14:45:07