Java脚本API支持新语言吗

wen java案例 2

本文目录导读:

Java脚本API支持新语言吗

  1. 什么是“新语言”?
  2. 当前支持的主流语言(通过第三方引擎)
  3. 如何判断你的环境支持哪些语言?
  4. 一个实际例子:在Java中执行Python
  5. 重要的未来趋势:GraalVM 脚本引擎

在Java中,脚本API(javax.script) 本身是一个框架,它不直接支持或限制某种特定的新语言,支持哪种语言,完全取决于你引入的脚本引擎实现(ScriptEngine implementation)

Java脚本API支持所有那些为该API提供了实现(JSR 223兼容实现)的编程语言。

以下是详细解答:

什么是“新语言”?

“新语言”通常指那些非Java虚拟机(JVM)原生的语言,或者较新出现的语言,Java脚本API最适合处理以下类型的语言:

  • 动态类型语言:如 JavaScript、Python、Ruby、Groovy、Kotlin(脚本模式)。
  • 领域特定语言(DSL):你可以用脚本API来执行自定义的规则引擎或配置语言。

当前支持的主流语言(通过第三方引擎)

你需要为每种语言添加对应的依赖库(Maven/Gradle坐标或直接下载JAR包),以下是常见的例子:

语言 引擎名称(常见实现) 说明
JavaScript / ECMAScript Nashorn(Java 8-14)
GraalVM JavaScript(推荐)
注意: Nashorn 在 JDK 15 中被正式移除,目前推荐使用 GraalVM 提供的 JavaScript 引擎。
Python Jython(Python 2)
GraalVM Python(实验性)
注意:Jython 主要支持 Python 2.7,Python 3 支持有限。
Ruby JRuby 比较成熟的 Ruby 实现。
Groovy Groovy Scripting Engine 最流行的 JVM 语言之一,非常适合脚本、DSL构建。
Kotlin Kotlin Scripting Kotlin 官方提供了脚本引擎(kotlin-scripting-jsr223 或类似模块)
R Renjin 用于统计计算的 R 语言。
Lua Luaj 轻量级脚本语言。
Clojure Clojure 的 JSR 223 实现 虽然 Clojure 主要在 REPL 中运行,但也提供了脚本引擎。

关键点: 上面的语言都可以通过 Java 脚本 API 获得支持,前提是你把对应的 JAR 包放到 classpath 中。

如何判断你的环境支持哪些语言?

你可以用一段代码来枚举当前 Classpath 下所有可用的脚本引擎:

import javax.script.*;
import java.util.List;
public class ListEngines {
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        List<ScriptEngineFactory> factories = manager.getEngineFactories();
        for (ScriptEngineFactory factory : factories) {
            System.out.println("引擎名称: " + factory.getEngineName());
            System.out.println("引擎版本: " + factory.getEngineVersion());
            System.out.println("语言名称: " + factory.getLanguageName());
            System.out.println("支持的别名: " + factory.getNames());
            System.out.println("短名称: " + factory.getShortNames());
            System.out.println("MIME类型: " + factory.getMimeTypes());
            System.out.println("文件扩展名: " + factory.getExtensions());
            System.out.println("-----------------------------------");
        }
    }
}

运行这段代码,你将看到所有可用的语言引擎,如果没有看到你想要的语言,说明对应的 JAR 包没有添加到项目中。

一个实际例子:在Java中执行Python

假设你已经把 Jython 的 JAR 放到了项目里,你可以这样做:

import javax.script.*;
public class RunPython {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        // 通过名称获取引擎(名称需要与Jython注册的别名匹配)
        ScriptEngine engine = manager.getEngineByName("python"); // 或 "jython"
        if (engine == null) {
            System.out.println("Python引擎未找到,请检查是否添加了Jython库。");
            return;
        }
        // 执行Python代码
        engine.eval("print('Hello from Python!')");
        engine.eval("result = 1 + 2 * 3");
        Object result = engine.get("result");
        System.out.println("Python计算结果: " + result); // 输出 7
    }
}

重要的未来趋势:GraalVM 脚本引擎

  • 背景:随着 JDK 15 移除 Nashorn,Java 原生的 JavaScript 支持消失了。

  • 解决方案GraalVM(由 Oracle 开发)成为现代 JVM 上执行多种语言(JavaScript、Python、Ruby、R、LLVM、WebAssembly)的事实标准。

  • 如何集成

    1. 使用 GraalVM JDK 发行版。
    2. 或通过 Maven 引入 org.graalvm.js:js 依赖,然后使用 ScriptEngine 获取 GraalVM.js 引擎。
    <dependency>
        <groupId>org.graalvm.js</groupId>
        <artifactId>js</artifactId>
        <version>21.3.0</version> <!-- 使用最新稳定版 -->
    </dependency>

    然后你的代码就可以像以前用 Nashorn 一样使用 engine = manager.getEngineByName("graal.js");"nashorn"(GraalVM 兼容别名)。

  • 支持新语言吗? 支持,但前提是该语言有兼容 JSR 223 的引擎实现
  • 是Java脚本API的功劳吗? 是的,它提供了统一接口(ScriptEngineInvocableCompilable),让你可以用一致的方式调用不同语言。
  • 你需要做什么? 找到该语言的 JVM 实现(如 Jython、JRuby、GraalVM Polyglot),将其 JAR 添加到 classpath,然后通过 getEngineByName() 获取引擎。

答案不是“支持不支持”,而是“只要你能找到实现,就可以支持”。

抱歉,评论功能暂时关闭!