与jre-8的高山Linuxdocker集装箱没有Nashorn引擎

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

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

scriptEnginenull 。 我试图得到默认引擎:

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

它也返回null ,因为它是java8,我的理解是,它应该返回jdk.nashorn.api.scripting.NashornScriptEngine

这是因为jre-8在这里是阿尔卑斯山的轻型版本吗? 我应该安装完整的JDK来解决这个问题吗?

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

项目维护人员明确删除了Nashorn脚本引擎,请参阅源代码 。 在Github上提出一个问题是有道理的,并询问维护者是什么原因。

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

您可以改为使用普通的Alpine图像,只需安装包含Nashorn的openjdk8软件包:

 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的好处是创build一个最小(大小)docker图像,这意味着它只有最less的Java组件。 这就是为什么Scripting API(Nashorn)已经从图像中删除的原因。 因此,如果我们需要特定的Javafunction(如Scripting API),则必须切换到完整的JDK版本,而不使用Alpine,或创build类似于Alpine的自定义基本映像,但使用Scripting API组件(对于这种情况)。

Interesting Posts