当前位置: 首页 > 知识库问答 >
问题:

格拉尔VM本机图像反射不起作用

西门庆
2023-03-14

我正在尝试使用maven插件创建GraalVM本机映像,但有一些问题
这里是maven插件的配置
我使用的是GraalVM JDK(通过Sdkman安装):

$ java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment GraalVM CE 21.1.0 (build 16.0.1+9-jvmci-21.1-b05)
OpenJDK 64-Bit Server VM GraalVM CE 21.1.0 (build 16.0.1+9-jvmci-21.1-b05, mixed mode, sharing)

我有一个简单的主类:

package it.r;

public class Main {

    public static void main(String[] args) {
        System.out.println("********");
        System.out.println(Main.class.getConstructors().length);
        System.out.println("********");
    }
}

当使用 mvn 执行它时,我得到的结果如下:

********
1
********

但是,当执行<code>mvn包

********
0
********

为什么会这样?

这里的git回购复制

这个问题似乎影响了Jackson的反序列化,因为在另一个示例中,我遇到了来自jackson的错误,该错误无法反序列化yaml文件,因为它找不到我的类的构造函数。

共有2个答案

孟思远
2023-03-14

使用反射的类需要注册才能包含在原生映像中,更多信息请见文档

岑俊弼
2023-03-14

当GraalVM本机映像将您的应用程序构建到本机二进制文件中时,它会静态地分析您的应用程序。

分析是静态的,因此您的应用程序可能使用的几个动态特性需要显式配置,例如:

  • 反射
  • 序列化
  • 方法处理
  • 使用资源(如<code>classloader.getResource())
  • JNI

这种显式配置以json配置文件的形式提供,例如,

您可以手动提供配置文件,但是您也可以使用javaagent运行您的应用程序,它将记录需要配置的特性的使用情况。

简而言之,您可以这样运行您的应用程序:

java -agentlib:native-image-agent=config-output-dir=/path/to/config-dir/

并执行使用要配置的代码的代码路径。这很重要,因为跟踪代理只能记录它实际看到的正在运行的代码的配置。

然后输出目录将包含一个json文件,例如如下所示:

[
{
  "name":"StringCapitalizer",
  "methods":[{"name":"capitalize","parameterTypes":["java.lang.String"] }]
},
{
  "name":"StringReverser",
  "methods":[{"name":"reverse","parameterTypes":["java.lang.String"] }]
}

该文件列出了需要包含在分析中的类和需要访问的二进制结果及其成员。它相当简单,但手动创建有点乏味,这就是为什么代理方法是首选。

还有一种编程方式来配置要注册的类和成员以进行反射,但使用它意味着您需要在应用中包含对 GraalVM 代码的依赖关系。

 类似资料:
  • 我正在构建一个Laravel web应用程序,其中我需要一个动态图像库,我构建了一个后端管理面板,可以在其中添加图像,我成功地将图像添加并保存到数据库中,但我无法编辑或删除它们。 错误是: UrlGenerationException中的ErrorException。php第17行:缺少[Route:galleries.update][URI:backend/galleries/{gallery}

  • 我尝试从数组中随机加载gif。我尝试了几种方法,但都没有奏效。我要么收到错误消息,要么图像就不会出现。 版本 1(结果:图像未显示): 版本2(结果:“无效调用”) 版本3(结果:无法加载图像): 有什么想法吗?

  • 我遇到了一个奇怪的问题。在我的反应原生应用程序中,如果我将事件设置为,它不会被触发,但如果我将相同的设置为中的,它会被触发。我在这里错过了什么? 为什么会这样?这是React Native的问题吗?我使用的是0.43版。

  • 问题内容: 我有一种情况,在使用网络应用程序时,我需要显示动态图像。我想显示图像文件名存储在变量中的位置。该变量是一个属性,它返回一个存储变量,该变量在上异步填充。 但是,当我刚这样做时,它会完美地工作: 正确的方法应该是什么? 问题答案: 我通过以下代码来工作 并在HTML中: 但是不确定为什么我以前的方法行不通。

  • 问题内容: 我正在使用html2canvas 0.4.0渲染屏幕截图,并希望将其另存为Web服务器上的图像。 为此,我编写了以下函数: JavaScript saveJPG.php 渲染完画布后,我可以将其完美地附加到HTML主体中,但是将其保存在服务器上会导致文件损坏(?)。 我可以在IrvanView中读取尺寸,但是图像是透明的/空的?该文件约为2.076 KB。所以它不是真的是空的。 我也尝

  • 我正在尝试使用透视表实现多对多关系。我的透视表的名称是“post_-tag”,列名是“post_-id”和“tag_-id”。post和tag模型类如下所示。 标签类别如下所示: post_tag表如下: 我正在使用以下代码尝试帖子的标签: 但它抛出了一个错误: 查询连接中的异常。php第729行:SQLSTATE[42S22]:未找到列:1054个未知列的“posts”。where子句中的pos