new ScriptEngineManager().getEngineByName()返回null

博客讲述了在生产环境中遇到的问题,即JavaScript引擎在本地开发环境正常工作,但在Docker容器中报空指针异常。经过排查,发现是由于使用的Docker镜像缺少必要的JRE组件nashorn.jar。通过更换Docker镜像或直接使用Java jar启动解决了问题。提醒读者注意Docker镜像的完整性和与生产环境的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在引入js引擎时,本地开发环境可以返回值,但是上了生产,就一直报空指针异常,原因是
new ScriptEngineManager().getEngineByName(“javascript”)返回了null

在这里插入图片描述
于是打印日志

  ScriptEngineManager manager = new ScriptEngineManager();


            List<ScriptEngineFactory> factories = manager.getEngineFactories();


             for (ScriptEngineFactory factory: factories) {
                 System.out.printf("Name: %s%n" + factory.getEngineName(),
                         "Version: %s%n" + factory.getEngineName(),
                         "Language name: %s%n" + factory.getLanguageName(),
                         "Language version: %s%n" + factory.getLanguageVersion(),
                         "Extensions: %s%n" + factory.getExtensions(),
                         "Mime types: %s%n" + factory.getMimeTypes(),
                         "Names: %s%n", factory.getNames());
             }
            System.out.println("kangfactories"+factories);
             System.out.println("kangcalculateUtils"+calculateUtils);
            System.out.println("kangscriptEngine"+calculateUtils.scriptEngine);
            System.out.println("kangformula"+formula);

发现脚本引擎数组返回都是null。

百度或者google这样的问题,一般是jdk版本是1.6导致的,但是我生产环境是1.8。
中间有怀疑1.8的小版本不够,有过升级,还是不行在这里插入图片描述
琢磨很久,久思不通,突然想到我的生产服务是放在docker中运行,docker容器和宿主机器是隔开的,
jdk也是从docker hub上拉的镜像

然后执行命令find / -name jdk

但是这些jdk有jar包nashorn.jar缺没几个,说明我docker拉的镜像有问题 find / -name nashorn.jar
在这里插入图片描述
最后换了镜像或者直接java -jar起都可以成功了

下面是我Dockerfile拉的有问题的jre ,请避坑 :
anapsix/alpine-java:8_server-jre_unlimited
M

import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; public class Calculator extends Application { private TextField display; @Override public void start(Stage primaryStage) { primaryStage.setTitle("Calculator"); // 创建显示区域 display = new TextField(); display.setEditable(false); // 创建按钮 Button[] buttons = new Button[20]; String[] buttonLabels = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" }; int row = 0; int col = 0; for (String label : buttonLabels) { buttons[col] = new Button(label); buttons[col].setOnAction(e -> handleButtonPress(e.getSource())); col++; if (col > 3) { col = 0; row++; } } // 布局 GridPane grid = new GridPane(); grid.setHgap(4); grid.setVgap(4); grid.add(display, 0, 0, 4, 1); for (int i = 0; i < buttons.length; i++) { grid.add(buttons[i], i % 4, i / 4 + 1); } Scene scene = new Scene(grid, 400, 400); primaryStage.setScene(scene); primaryStage.show(); } private void handleButtonPress(Object source) { Button button = (Button) source; String text = button.getText(); if (text.equals("=")) { try { String result = calculate(display.getText()); display.setText(result); } catch (Exception e) { display.setText("Error"); } } else if (text.equals("C")) { display.clear(); } else { display.setText(display.getText() + text); } } private String calculate(String expression) { try { expression = expression.replaceAll("÷", "/"); Object result = new ScriptEngineManager().getEngineByName("JavaScript").eval(expression); return String.valueOf(result); } catch (Exception e) { throw new RuntimeException("Invalid expression", e); } } public static void main(String[] args) { launch(args); } } 给我一个运行效果图
最新发布
03-10
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值