GraalVM 更新:Java 库取代 GraalVM Updater (gu)
Oracle Labs 宣布,从 GraalVM JDK 21 开始,Java 库将取代 GraalVM Updater (gu)。gu 工具曾用于安装和管理 GraalVM 语言运行时及实用程序,但在 JDK 21 中已被移除,其功能将由多个 Java 库提供。
主要变化
- gu 工具的移除:gu 最后一次支持是在 GraalVM JDK 20 中,用于安装如 Native Image 和 JavaScript 等包。从 JDK 21 开始,gu 被移除,相关功能由 Java 库替代。
- 多语言支持:Java 库不仅支持 Java,还支持 JavaScript、Node.js、Python、WebAssembly 和 Ruby 等其他语言。
- 向后兼容性:多语言 API 向后兼容,现有项目无需代码更改。
变更原因
- 升级复杂性:使用 gu 升级语言时,JDK 也需要升级,增加了升级过程的复杂性。
- 安装的不可变性:gu 会更改安装内容,而系统和管理工具要求安装内容不可变,这导致 gu 难以使用。
- 语言启动器混淆:JDK bin 目录中的语言启动器(如 Python)对用户来说较为混淆。
- 语言依赖问题:gu 无法让 Java 应用程序声明对其他语言(如 Python)的依赖。
Truffle 框架的松耦合
Truffle 框架现在与 JDK 解耦,语言运行时可通过 Maven Central 作为库使用。未来的语言运行时将向后兼容最新的长期支持 (LTS) 版本。独立语言下载现在取代了 JDK 中的独立语言启动器。GraalVM JDK 21 是运行时优化支持的必要条件。
安装与使用
要使用新库,需要安装 GraalVM。GraalVM 提供了适用于 Linux、macOS 和 Windows 的二进制文件,社区版二进制文件则使用限制较少的许可证。
示例应用
以下是一个在 Java 应用中集成 JavaScript 的示例,所需的 Maven 依赖如下:
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>23.1.0</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>js-community</artifactId>
<version>23.10</version>
<type>pom</type>
</dependency>
Gradle 依赖如下:
dependencies {
implementation("org.graalvm.polyglot:polyglot:23.1.0")
implementation("org.graalvm.polyglot:js:23.1.0")
}
许可与互操作性
默认库使用 GraalVM 免费条款和条件 (GFTC) 许可,带有 -community 后缀的库则使用开源许可证。
库支持 Java 和 JavaScript 之间的互操作性,Java 代码可以从 JavaScript 中调用,JavaScript 也可以嵌入到 Java 程序中。以下是一个从 Java 应用程序调用 JavaScript 函数的示例:
static String JAVASCRIPT_CODE = "(function myFirstFunction(language) { console.log('Hello world from ' + language); } )";
public static void main(String[] args) {
System.out.println("Hello world from Java!");
try (Context context = Context.create()) {
Value value = context.eval("js", JAVASCRIPT_CODE);
value.execute("JavaScript!");
}
}
运行结果如下:
Hello world from Java!
Hello world from JavaScript!
更多信息
更多关于 JavaScript 和 Java 互操作性的信息,以及其他语言(如 Python、R、Ruby、WebAssembly 和 LLVM)的信息,请参阅参考手册。有关最新变更的详细信息,请参阅 Christian Humer 撰写的 Truffle Unchained 博客文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。