Alpine Linux Docker 带有 jre-8 的容器没有 Nashorn 引擎

Alpine Linux Docker Container with jre-8 does not have Nashorn Engine

我有一个基于 FROM anapsix/alpine-java:8_server-jre_unlimited 的 docker 图像。但是,当我尝试

ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");

scriptEnginenull。我尝试使用 :

获取默认引擎
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("js");

还有 returns null,因为它是 java8,我的理解是,它应该 return jdk.nashorn.api.scripting.NashornScriptEngine

这是因为这里的jre-8是Alpine的轻量级版本吗?我应该安装完整的 JDK 来解决这个问题吗?

参考:http://blog.takipi.com/lean-mean-java-virtual-machine-making-your-docker-7x-lighter-with-alpine-linux/

The project maintainer explicitly removes Nashorn script engine, see the source。在 Github 提交问题并询问维护者原因是什么是有意义的。

Image anapsix/alpine-java 不使用 Alpine 的官方 Java 包,而是使用 Oracle JDK(仅作为针对 glibc 编译的二进制文件分发)和 glibc hack 来制作它以某种方式 运行 在基于 musl 的系统上。 Alpine 支持它,我强烈建议您不要使用它。

您可以改用普通的 Alpine 映像并简单地安装 openjdk8 包,其中包括 Nashorn:

echo "http://dl-cdn.alpinelinux.org/alpine/v3.4/community" >> /etc/apk/repositories
apk update
apk add openjdk8

Oracle JDK 只是 OpenJDK(即开源)的品牌(专有)发行版,代码库几乎相同。这意味着 运行 在 Oracle JDK 8 运行 上的几乎所有 Java 应用程序也在 OpenJDK 8.

虽然安装openjdk8可以解决问题,但这不是正确的做法。使用 Alpine 的优点是创建最小(大小)docker 图像,这意味着它只有最少的 Java 组件。这就是脚本 API (Nashorn) 已从映像中删除的原因。因此,如果我们需要特定的 Java 功能,例如脚本 API,我们必须切换到完整的 JDK 版本而不使用 Alpine,或者创建一个类似于 Alpine 的自定义基础镜像,但使用编写 API 个组件的脚本(对于这种情况)。