- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
Espresso
使用 GraalVM,您可以在 HotSpot 上、在 Native Image 中以及在 Truffle 上正常运行 Java 应用程序。
Espresso,也称为 Java on Truffle,是基于 GraalVM 作为 Truffle 解释器构建的 Java 虚拟机规范(Java SE 8、Java SE 11、Java SE 17 和 Java SE 21)的实现。它是一个精简的 Java VM,包含 VM 的所有核心组件,实现与 Java 运行时环境库(libjvm.so
)相同的 API,并重用现有的标准库。有关更多信息,请参阅实现细节。
Espresso 是开源的,其代码库可在 GitHub 上访问。
Espresso 通过 Java 字节码解释器运行 Java,该解释器使用 Truffle 框架(一个用于编写编程语言解释器的开源库)实现。借助 Espresso,Java 可以与 GraalVM 生态系统中的其他语言(例如 JavaScript、Python、Ruby)以相同的原理执行,直接与这些语言互操作,并在同一内存空间中来回传递数据。除了完整的语言互操作性之外,使用 Espresso 您还可以
- 在与宿主 Java VM 分离的上下文中运行 Java 字节码。
- 运行 Java 8、Java 11、Java 17 或 Java 21 访客 JVM,例如,通过使用 GraalVM 的 Polyglot API,允许在 Java 21 应用程序中嵌入 Java 17 上下文。
- 利用 Truffle 框架提供的整个工具堆栈,这些工具以前在 Java 中不可用。
- 改进宿主 Java VM 与在 Truffle 上运行的 Java 程序之间的隔离,因此您可以运行信任度较低的访客代码。
- 在原生可执行文件的上下文中运行,同时仍允许动态加载字节码。
Espresso 通过了 Java 兼容性工具包(JCK 或 Java SE 的 TCK)。
入门 #
Espresso 可作为提供 Java 21 环境的独立发行版使用。您可以下载基于 Oracle GraalVM 或 GraalVM Community Edition 的独立版本。
-
下载适用于您的操作系统的 Espresso 24.2 独立版
- 解压归档文件
tar -xzf <archive>.tar.gz
- 独立版除了原生启动器之外,还带有一个 JVM。检查版本以查看运行时是否处于活动状态
# Path to Espresso installation ./path/to/bin/java -version
在 Espresso 上运行 Java 应用程序 #
Espresso 独立版中包含的 java
启动器与标准的 java
启动器工作方式相同
执行类文件
java [options] class
执行 JAR 文件
java [options] -jar jarfile
您还可以从模块中的主类运行 Java 应用程序,或运行单源文件程序
java [options] -m module[/<mainclass>]
java [options] sourcefile
默认情况下,Espresso 使用独立版中包含的标准库运行,但可以指定不同的 Java 安装目录(java.home
)。只要新的 Java home 是受支持的版本(8、11、17 或 21),它就会自动切换版本。
java --java.JavaHome=/path/to/java/home -version
注意:如果您使用
java
启动器的-server
选项,则不会使用 Espresso,而是启动 HotSpot。您也可以使用-truffle
明确要求使用 Espresso(默认)。
性能考量 #
启动时间目前还无法与常规 GraalVM 即时 (JIT) 执行所提供的速度相匹配,但开发团队在创建了完全可用的 Espresso 运行时后,现正专注于性能。您仍然可以通过向 java
传递以下选项来影响性能:
--engine.Mode=latency
可启用 Truffle 的延迟模式,以加快 JIT 编译速度,但会牺牲峰值性能。
--vm.XX:
语法确保将选项传递给底层的 Native Image VM。当使用 -XX:
语法时,VM 首先检查 Espresso 运行时中是否存在此类选项。如果不存在,它将尝试将此选项应用于底层的 Native Image VM。这对于 MaxDirectMemorySize
等选项可能很重要,因为这些选项可以在两个级别独立设置:-XX:MaxDirectMemorySize=256M
控制在 Espresso 上运行的 Java 程序(访客 VM)可以保留多少原生内存,而 --vm.XX:MaxDirectMemorySize=256M
控制 Native Image(宿主 VM)可以保留多少原生内存。
开始运行应用程序 #
从命令行
为确保您已成功安装 Espresso,请验证其版本
# Path to Espresso installation
./path/to/bin/java -version
以 HelloWorld.java
为例,从命令行编译并运行它
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
$JAVA_HOME/bin/javac HelloWorld.java
$JAVA_HOME/bin/java HelloWorld
以一些实际应用程序为例,尝试运行 Spring PetClinic —— 一个演示 Spring Boot 与 Spring MVC 和 Spring Data JPA 结合使用的示例 Web 应用程序。
- 克隆项目并导航到项目目录
git clone https://github.com/spring-projects/spring-petclinic.git cd spring-petclinic
- 构建 JAR 文件(Spring PetClinic 使用 Maven 构建)
./mvnw package
- 然后从命令行运行它
java -jar target/spring-petclinic-<version>-SNAPSHOT.jar
- 应用程序启动后,请通过 localhost:8000 访问它。
从 IDE
要在 IDE 中在 Espresso 上运行 Java 项目,您需要将 Espresso 独立版设置为项目的默认 JDK。例如,要使用 IntelliJ IDEA 运行 Spring PetClinic 项目,您需要
-
导航到文件,然后到项目结构。点击项目,然后点击项目 SDK。展开下拉菜单,点击添加 JDK,然后打开您安装 Espresso 独立版的目录。对于 macOS 用户,JDK 主路径将是
/Library/Java/JavaVirtualMachines/{espresso-standalone}/Contents/Home
。给它一个名称,然后点击应用。 -
生成源代码并更新项目文件夹。在 Maven 侧边栏中,点击带有旋转图标的目录
-
点击运行。
调试 #
您无需配置任何特殊设置即可从您喜欢的 IDE 调试器调试运行 Espresso 的 Java 应用程序。例如,从 IntelliJ IDEA 启动调试会话是基于运行配置的。
下一步阅读什么 #
Espresso 实现了 Java 与 GraalVM 生态系统中其他语言的无缝互操作性。查阅与 Truffle 语言的互操作性指南,了解如何加载用其他语言编写的代码、在语言之间导出和导入对象等。
要了解实现方法、项目当前状态和已知限制,请前往实现细节。
您已经可以在 Espresso 执行模式下运行一些大型应用程序,例如 Eclipse IDE、Scala 或其他语言的 REPL。我们建议您查看演示应用程序集合。
如果您有问题,请查看可用的常见问题,或直接通过 GraalVM Slack 中的 #espresso 频道联系我们。