本文目录导读:

在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)的事实标准。
-
如何集成:
- 使用 GraalVM JDK 发行版。
- 或通过 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的功劳吗? 是的,它提供了统一接口(
ScriptEngine、Invocable、Compilable),让你可以用一致的方式调用不同语言。 - 你需要做什么? 找到该语言的 JVM 实现(如 Jython、JRuby、GraalVM Polyglot),将其 JAR 添加到 classpath,然后通过
getEngineByName()获取引擎。
答案不是“支持不支持”,而是“只要你能找到实现,就可以支持”。