有没有办法在Java 21中执行简单的JavaScript表达式而无需任何手动安装?

问题描述 投票:0回答:1

例如,我安装了21版本,据我了解,我不能再使用Nashorn引擎了。

但也许 GraalVM 适合我?

我已经安装了所有必需的依赖项:

    <dependency>
        <groupId>org.graalvm.js</groupId>
        <artifactId>js</artifactId>
        <version>21.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.graalvm.js</groupId>
        <artifactId>js-scriptengine</artifactId>
        <version>21.1.0</version>
    </dependency>

这是我尝试执行的一个简单示例:

public static void main(String[] args) throws ScriptException {
    try (Context context = Context.newBuilder("js")
            .allowAllAccess(true)
            .build()) {
        // Evaluate JavaScript code
        String jsCode = "console.log('Hello, GraalVM!');";
        context.eval("js", jsCode);
    } catch (Exception e) {
        throw new ScriptException("Script execution failed: " + e.getMessage());
    }
}

但是,我收到错误:

线程“main”中的异常javax.script.ScriptException:脚本 执行失败:未安装 ID 为“js”的语言。已安装 语言有:[]。 在 org.example.Main.main(Main.java:23)

我也尝试过这样的事情:

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine  = manager.getEngineByName("JavaScript");
    engine.eval("print('HI');");
}

但是我遇到了另一个错误:

线程“main”中的异常 java.lang.NullPointerException:不能 调用“javax.script.ScriptEngine.eval(String)”,因为“engine”是 org.example.Main.main(Main.java:20) 为空

问题是由于某种原因无法手动安装任何组件。我只需要一些依赖项并使一切正常。一些“开箱即用”的东西。有解决这个问题的方法吗?也许还有其他可用的引擎?

谢谢大家。

javascript java graalvm nashorn
1个回答
0
投票

项目 jsEngineScriptJDK21

├── pom.xml
├── README.txt
└── src
    └── main
        └── java
            └── com
                └── example
                    └── JsTest.java

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>js-engine-script</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jsEngineScript</name>
    <description>jsEngineScript App Project</description>
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjdk.nashorn</groupId>
            <artifactId>nashorn-core</artifactId>
            <version>15.4</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
    </build>

</project>

JsTest.java

package com.example;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JsTest {
    public static void main(String[] args) throws ScriptException {
        try {
            //ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            //ScriptEngine engine  =new ScriptEngineManager().getEngineByName("JavaScript");
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine  = manager.getEngineByName("JavaScript");

            if (engine == null) {
                System.out.println("Nashorn script engine not available.");
                return;
            }

            engine.eval("print('HI');");
            engine.eval("print('Hello, Nashorn!');");
            engine.eval("var x = 10 + 20; print('x = ' + x);");

        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
}

构建并运行

构建

mvn clean package

mvn dependency:copy-dependencies -DoutputDirectory=target/libs

奔跑

java -cp "target/libs/*:target/app.jar" \
  com.example.JsTest

结果:

HI
Hello, Nashorn!
x = 30
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.