问题标签 [graalvm-native-image]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Serializable.class 怎么不能从 Class.class 分配?
在org.springframework.core.SerializableTypeWrapper
(版本 5.2.3)中,第 112 行有以下代码:
我对第二个检查 ( !Serializable.class.isAssignableFrom(Class.class)
) 感到好奇:它是否可以评估为true
(也就是说,Serialazable.class
不能从 分配Class.class
)?
这是Class#isAssignableFrom()
javadoc 所说的:
确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。
查看 的代码Class
,我看到以下内容:
Serializable
的超接口也是如此,Class
并且应该始终可以从Class
. 但 Spring 代码中的检查表明有时并非如此。
怎么来的?在什么情况下会发生这种情况,为什么它们不违反 Java 语言规范?
java - 在 GraalVM 本机映像中使用 Google Api 服务时出现“无效的 JWT:受众检查失败”
我有一个简单的应用程序,它通过基于 HTTP 的google-api-services-logging
. 我最初使用的是 gRPCcloud-logging
库,但根本无法让它与 GraalVM 一起使用。但不幸的是,我也在为 HTTP 变体而苦苦挣扎。该代码在传统 Java VM 上执行时运行良好,但在运行本机映像时在运行时失败。
本机图像属性
反射配置.json
资源配置.json
应用程序.scala
Dockerfile
我怀疑这与加密/ SSL 相关功能有关,但我没有东西可以尝试。
java - 在构建原生 quarkus 映像时,我应该如何(重新)构造我的代码以启用运行时类初始化?
我正在使用 quarkus 构建本机图像,并且 graal 分析失败并出现错误:
它正确且合乎逻辑地声明应该在运行时初始化随机数生成器提供程序的类。但是,与docs不同,没有给出调用路径,因为:
对象已在没有本机映像初始化工具的情况下进行了初始化,并且无法跟踪堆栈跟踪
我不知道如何重组我的代码来支持这一点,据我所知,我并没有做任何真正异国情调的事情。为了准备这个问题,我粗暴地将涉及类的代码从 中移到了一起com.nimbusds
,现在它位于OAuthService
和中OAuthAccessTokenProvider
。OAuthService
仅由 my 使用OAuthResouce
,即使在使这两个服务@RequestScoped
强制执行延迟初始化之后,错误消息仍然保持不变。
当我添加 时--initialize-at-run-time=ff.service.identity.application.OAuthService
,我实际上收到的关于观察到的问题的信息较少。
我应该避免初始化这些类,但我不知道我做错了什么或存在哪些其他可能性。我监督了什么?
编辑:我正在使用 GraalVM 版本 20.1.0(Java 版本 11.0.7)构建 Quarkus 1.6.1.Final。
自 GraalVM 19.0.0 以来,实际上已弃用涉及标志的解决方案--rerun-class-initialization-at-runtime
(我找不到链接):
警告:使用已弃用的选项 --rerun-class-initialization-at-runtime。目前没有替代此选项。尝试使用 --initialize-at-run-time 或直接使用非 API 选项 -H:ClassInitialization。
google-cloud-firestore - 使用 Cloud Firestore 时出现 Micronaut Native Image gRPC 错误
我有一个基本的 Micronaut 应用程序,我正在将其构建为本机映像。我正在用这些参数构建它:
图像构建良好,我可以启动它,但是在尝试访问 Firestore 时,我得到了这个异常:
在这一点上,我对 Micronaut 和 GraalVM 都很陌生,所以我确信我忽略了一些简单的东西,但是我无法找到关于这个特定错误的太多信息,而且我确实找到的东西并没有解决我的问题。
我正在使用 Micronaut 2.0.1 并使用 maven-shade-plugin 构建一个 fatJar,然后我正在针对它运行本机图像生成。
我的 Firestore 配置非常简单,如下所示:
然后是我注入此配置的相关位:
pom.xml 中的 Firebase 依赖项
如果我删除 firebase-admin 依赖项并注释掉 Firestore 的用法,那么我的请求确实会得到正确处理,所以它肯定似乎与那个和 gRPC 有关。
任何帮助将不胜感激!
java - 构建本机映像时,如何调试“映像堆中不允许...的实例”?
我有一个使用 Micronaut 2.0.0 实现 RESTful API 的小型 Java 应用程序。在底层,它使用 Redisson 3.13.1 去 Redis。反过来,Redisson 使用 Netty (4.1.49)。
该应用程序在“经典”java 中运行良好(在 HotSpot 上,Java 8 和 11)。
我正在尝试使用 GraalVM 从该应用程序中构建本机映像。
命令大概是这样的:
这是我得到的:
这只是输出的一部分,它还会生成关于其他 3 个错误的类似报告。
我仍在努力理解这个问题,但我想,正如其中java.net.InetAddress
的本机方法一样,它和它的子类java.net.Inet4Address
都不能在构建时初始化。这意味着Inet4Address
对于在构建时(在初始化阶段,用 Java 术语)初始化的代码,一个实例是不可见的。原生图像生成器找到了一种方法,可以达到这样一个对象可见的程度。它甚至显示了跟踪,但问题ClusterConnectionManager$1
是Runnable
它只在运行时提交Executor
(在静态初始化之后)。
你如何调试这种情况?即:
- 你如何找到罪魁祸首?
- 找到罪魁祸首后如何解决?
PS。如果我添加--initialize-at-run-time=java.net.InetAddress
,它会以不同的方式失败:
Java 将自身报告为build 25.252-b09-jvmci-20.1-b02, mixed mode
.
聚苯乙烯。我发现这个No instance of ... are allowed in the image heap 因为这个类应该在图像运行时初始化,并且似乎 Quarkus 问题已修复。但我仍然不明白如何解决手头的问题。任何帮助,将不胜感激。
spring - Spring Boot 2.3 + GraalVM 解析配置时遇到错误
我有一个 Spring Boot 2.3 应用程序,我想将其编译为本机映像。
我使用 GraalVM20.1.0.r11-grl
作为 SDK/JDK,我的应用程序编译并运行良好。我正在使用 Gradle 作为我的构建工具,并且正在使用https://github.com/ayltai/spring-graalvm-native-plugin来访问 Native Image 功能 - 它运行良好。
当我尝试编译本机映像时,我得到以下堆栈跟踪(原始在详细模式下大约 900 行,所以我试图挑选出相关位):
所以这个错误似乎正在发生,因为 Native Image 认为我的类路径上有一个 WebFlux 组件,并且当它试图处理该组件时,它找不到它,因此ClassNotFoundException
在跟踪的底部。
这是我的依赖项:
那里没有反应组件。我唯一能想到的是某处存在传递依赖,但是非反应性组件具有传递依赖没有意义吗?
以前有人遇到过这个问题吗?我该如何调试和解决这个问题?
java - 带有spring boot postgresql的GraalVM native-image将无法构建
我目前正在尝试使用 GraalVM 原生图像工具。目标是在 postgresql 中运行 spring boot webapp。
我的项目使用 mvn clean package 编译,.JAR 运行起来就像 docker-postgresql 的魅力一样,但我无法以此构建本机映像。
我从 Spring 技巧中的 Josh Long 那里找到了这个简洁的编译脚本,它对以前项目中的配置有很大帮助。到目前为止,我不知道为什么原生图像不会构建,因为它只是抛出一个 StringIndexOutOfBoundsException。我有另一个带有 h2 和 jpa 的项目,它使用完全相同的参数来执行此操作。
希望有一些建议可以在哪里更改配置或经验以及 ofc 解决方案。
我目前使用 GraalVM 版本 20.1.0(Java 版本 1.8.0_252)作为 JDK。
下面是堆栈跟踪和示例项目。我还在https://file.io/HXudRpH80dDz上传了 ./compile.sh 的终端输出,因为如果有帮助的话,它太长了。
编译.sh
pom.xml
应用程序属性
PostgresApplication.java
雇员.java
EmployeeRowMapper.java
EmployeeDao.java
EmployeeDaoImpl.java
EmployeeService.java
EmployeeServiceImpl.java
应用控制器.java
java - GraalVM Native Image 在 Springdoc 依赖上失败
我正在尝试使用 spring boot 和 GraalVM Native Image 创建一个示例应用程序,但是一旦我添加了 Springdoc 的依赖项,生成的可执行文件就不再工作,原因如下:
我当前的依赖项是:
在我添加 SpringDoc 之前,一切都运行良好。已经尝试将一些springdoc包添加到--initialize-at-build-time但没有成功。
我正在使用 com.github.ayltai.spring-graalvm-native-plugin 来处理 gradle 任务,我的依赖项是:
任何提示将不胜感激。
java - 与 Java SE 兼容的 GraalVM 原生镜像(Substrate VM - Darwin)
SubstrateVM 允许将 JAVA 应用程序编译成 macOS ( Darwin ) 本机可执行文件。我找不到任何地方记录 SubstrateVM 实现了什么样的 Java (SE) 包。当我想将我的应用程序编译成 macOS (iOS) 本机可执行文件时,当我要决定可以使用哪种 Java 库时,这是我最大的担忧,因为一些开源/第三方 Java 库可能正在使用SubtracteVM 中可能找不到的某些 Java 包(sun 或 Java Swing)。我曾经使用类似 robovm 之类的 AOT,我知道有很多 Java 包没有在其中实现。
到目前为止,我能找到的有用限制是这个。但它仍然没有提到它是(或不)实现的 Java SE 的哪个部分。谁能指点我在哪里可以找到这些信息?
clojure - 如何减小 graal 本机图像的文件大小?
我有这个项目:https ://github.com/crinklywrappr/repoman
它非常短(~150loc)。当我运行lein native-image
它时,它会产生一个巨大的4gb 3gb 二进制文件(至少在 Windows 上)。
我认为大小有几个原因:
由于编译 clj-http-lite 时出错,需要 --allow-incomplete-classpath。(这可能已修复它)包括此提交将大小减少了 1gb。- JCA 安全服务增加了一些规模,开发人员正在寻找减少这种情况的方法。
在今天之前,我从来没有用 graal 制作过原生图像。可以采取哪些步骤来减小 graal 原生图像的二进制大小?