该文件包含许多用 svm 注释标注的最终类
Posted: Mon Mar 24, 2025 3:54 am
在源代码树中,您将找到一个 MicronautSubstitutions.java 文件。。当被substratevm调用时,它们用于重定向或重新计算这些类中的特定字段。 Graal 使用substratevm来构建原生镜像。使用这些注释允许开发人员通过手动指向正确的方向,或者简单地覆盖方法或字段来解决stratevm的限制。 Micronaut 在这个 java 文件中包含了他们自己应用程序的基础知识,所以我们不必担心。
Dockerfiles
根目录中还有两个 Dockerfile。名为 Dockerfile 的文件将基于 oracle/graalvm-ce:1.0.0-rc8 基础镜像创建一个单独的 docker 镜像,并包括为该镜像创建可工作的本机镜像的步骤。 DockerfileAllInOne 大致相同,但使用中间构建器映像并将本机映像移动到基于小型 alpine 的映像,以减小最终 docker 映像的大小。让我们更深入地研究这些图像,因为它们非常有趣。
Docker 镜像
您还会注意到,为了构建本机映像,dockerfile 中还有相 赌场数据 当多的步骤。
首先,我们有 gradle 构建。没什么特别的。我们将使用 shadowJar 插件在 ./gradlew 构建步骤中创建 fat-jar。移动一些文件后,我们得到以下行:
这是 Micronaut 的 GraalVM 兼容性比 Spring 更好的原因之一。这一步将为我们生成一个 ReflectionConfigurationFile,我们可以将其作为参数传递给 native-image 命令。当我们在代码中使用动态反射调用时,GraalVM 编译器不知道需要哪些类。例如,只有当我们知道 someVariable 是什么时,才能评估 Class.forName(someVariable) 调用。作为开发人员,我们通常知道这一点,因此我们可以将这些类添加到配置文件中。这样,编译器就知道需要期待什么以及需要提前编译哪些类。这些文件有更多配置选项可用,但是对于本示例来说这已经足够了。
一旦我们运行该命令,您将在构建文件夹中找到一个 reflect.json 文件。如果您想手动执行此操作,则需要按如下方式执行:
快速浏览一下就会发现,它包含很多条目,如果手动配置的话会非常困难或麻烦。
Dockerfiles
根目录中还有两个 Dockerfile。名为 Dockerfile 的文件将基于 oracle/graalvm-ce:1.0.0-rc8 基础镜像创建一个单独的 docker 镜像,并包括为该镜像创建可工作的本机镜像的步骤。 DockerfileAllInOne 大致相同,但使用中间构建器映像并将本机映像移动到基于小型 alpine 的映像,以减小最终 docker 映像的大小。让我们更深入地研究这些图像,因为它们非常有趣。
Docker 镜像
您还会注意到,为了构建本机映像,dockerfile 中还有相 赌场数据 当多的步骤。
首先,我们有 gradle 构建。没什么特别的。我们将使用 shadowJar 插件在 ./gradlew 构建步骤中创建 fat-jar。移动一些文件后,我们得到以下行:
这是 Micronaut 的 GraalVM 兼容性比 Spring 更好的原因之一。这一步将为我们生成一个 ReflectionConfigurationFile,我们可以将其作为参数传递给 native-image 命令。当我们在代码中使用动态反射调用时,GraalVM 编译器不知道需要哪些类。例如,只有当我们知道 someVariable 是什么时,才能评估 Class.forName(someVariable) 调用。作为开发人员,我们通常知道这一点,因此我们可以将这些类添加到配置文件中。这样,编译器就知道需要期待什么以及需要提前编译哪些类。这些文件有更多配置选项可用,但是对于本示例来说这已经足够了。
一旦我们运行该命令,您将在构建文件夹中找到一个 reflect.json 文件。如果您想手动执行此操作,则需要按如下方式执行:
快速浏览一下就会发现,它包含很多条目,如果手动配置的话会非常困难或麻烦。