Page 1 of 1

GraalVM 原生镜像 – REST API(第 2 部分)

Posted: Sun Mar 23, 2025 8:18 am
by roseline371274
这个端口是我正在编写的 GraalVM 系列的一部分。在上一篇文章中(可在此处 中国号码数据 找到),我讨论了什么是 GraalVM,并给出了一个如何开始的基本示例。在这篇文章中,我们将探讨使用 GraalVM 在 Java 中创建简单 REST API 的可能性。

如果您想继续操作,请确保您已经正确安装了 GraalVM。本系列的上一篇文章包含了所有设置的详细信息。

入门和限制
创建普通 Java 应用程序时,我们可以通过一些选项来快速设置 REST API。然而,GraalVM 仍然有其局限性。正如上一篇文章所列出的,主要问题是反射和动态类加载。由于 GraalVM 正在不断开发,可能会出现一些回归问题,较新的 GraalVM 版本将无法与您选择的框架一起使用。除非另有说明,我将使用 GraalVM 1.0.0-rc8。

那么,让我们看看我们的应用程序的常见候选者,并快速探讨一下为什么我们不能使用它们。

JavaEE(或 Jakarta EE)
普通的 JavaEE 根本行不通。 JavaEE 应用程序需要实现 JavaEE API,因此默认情况下不能作为独立 Jar 运行。

我们可以尝试使用 Thorntail 来提供这个 JavaEE 实现,并提供一个嵌入式应用程序服务器来将其作为独立的 fat-jar 运行。然而,我们很快就会遇到一个问题,因为 Thorntail 严重依赖反射和动态类加载。 GraalVM 中有一些选项可以解决这个问题,但很快就会变得混乱。我稍后会在文章中再次讨论这个解决方法。


Spring 是 JavaEE 的常见模拟,它不需要实现 JavaEE API 即可工作。我个人很喜欢 Spring 和 Spring Boot,但是当我们尝试在 GraalVM 的原生镜像中使用 Spring 时,我们又会遇到问题。与 Thorntail 类似,甚至更甚,Spring 的大部分内部工作都依赖于反射。 Spring 背后的公司 Pivotal 确实承诺在最新的 Spring 5 版本中与 GraalVM 兼容。在撰写本文时,spring-fu和SpringR是使简单的 Spring 应用程序在 GraalVM 中运行的几个示例。然而,更复杂的应用程序很快就会遇到问题。