我正在使用当前版本的社区版:GraalVM/native-image 22.1.0
我的项目依赖于日志框架 logback (版本 1.2.3)
如果我想用 graalVM 编译我的“一体式”jar,本机映像会抱怨:
错误:java.util.concurrent.ExecutionException:com.oracle.graal.pointsto.constraints.UnsupportedFeatureException:映像堆中不允许存在 ch.qos.logback.classic.Logger 的实例,因为此类应在映像运行时初始化。要查看该对象是如何实例化的,请使用 --trace-object-instantiation=ch.qos.logback.classic.Logger。
我尝试了许多不同的设置排列,例如--initialize-at-run-time=\<complete list of logback classes\> 和--initialize-at-run-time
我尝试使用以下命令生成反射配置文件
java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar build/myjar-all.jar
并将其添加到配置文件中
-H:ReflectionConfigurationFiles=reflect-config.json
但没有成功。总是收到与 logback 相关的不同错误消息。
所以我的问题是:
有人之前用 graalvm 成功编译过 logback 吗?
我正在使用基本示例在 Ubuntu 上构建 lambda。它构建时没有任何错误,但如果我在 aws 上上传并测试它,则会崩溃:
{
"errorMessage": "RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b Error: Runtime exited with error: exit status 1",
"errorType": "Runtime.ExitError"
}
Run Code Online (Sandbox Code Playgroud)
日志输出为:
START
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Version: $LATEST.~.jwtauthorizeraws.jwtauthorizerawsapplication: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./~.jwtauthorizerawsapplication)
END
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
REPORT
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Duration: 56.02 ms
Billed Duration: 57 ms
Memory Size: 128 MB
Max Memory Used: 7 MB
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Error: Runtime exited with error: exit status 1
Runtime.ExitError
Run Code Online (Sandbox Code Playgroud) 我正在尝试从一个胖 jar 文件创建一个本地图像
$ native-image -H:+TraceClassInitialization --initialize-at-run-time=org.slf4j,org.apache.log4j \
-jar ./my-jar-with-dependencies.jar
Run Code Online (Sandbox Code Playgroud)
我收到了如下错误消息:
错误:应该在运行时初始化的类在图像构建期间被初始化:org.apache.log4j.Level 该类被请求在构建时初始化(从命令行)。org.apache.log4j.Level 已在没有本地图像初始化检测的情况下进行初始化,并且无法跟踪堆栈跟踪。尽量避免初始化导致 org.apache.log4j.Level org.slf4j.log4j12.Log4jLoggerAdapter 初始化的类,该类在构建时(从命令行)被请求初始化。org.slf4j.log4j12.Log4jLoggerAdapter 已在没有本机图像初始化检测的情况下进行初始化,并且无法跟踪堆栈跟踪。尽量避免初始化导致 org.slf4j.log4j12.Log4jLoggerAdapter org.apache.log4j 初始化的类。在构建时(从命令行)请求类被初始化的记录器。org.apache.log4j.Logger 已在没有本地图像初始化检测的情况下进行初始化,并且无法跟踪堆栈跟踪。尽量避免初始化导致 org.apache.log4j.Logger 初始化的类
解决avoiding to initialize the class问题的途径和途径是什么?我该如何处理这些消息?
我的 graavlVM 版本是 2.0.0-java11
我正在尝试使用 GraalVM 和本机图像构建本机应用程序。开始构建过程时发生错误。类路径中似乎缺少 cl.exe。就像 GraalVM 网站上提到的那样,我已经安装了“GRMSDKX_EN_DVD.iso”(适用于 Windows 7 和 .NET 的 Windows SDK)。我也试过为 Windows 10 安装 Windows SDK。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>native-image -jar C:\Users\tm\Desktop\DemoGraalVM\target\Demo-1.0-SNAPSHOT.jar
[Demo-1.0-SNAPSHOT:28776] classlist: 2,435.83 ms, 1.16 GB
[Demo-1.0-SNAPSHOT:28776] setup: 646.59 ms, 1.16 GB
Error: Default native-compiler executable 'cl.exe' not found via environment variable PATH
Error: To prevent native-toolchain checking provide command-line option -H:-CheckToolchain
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1
Run Code Online (Sandbox Code Playgroud)
我正在使用 Windows 10,graalvm-ce-java8-windows-amd64-20.2.0。我也在运行 Visual Studio …
在org.springframework.core.SerializableTypeWrapper(5.2.3版)中,第112行有如下代码:
if (GraalDetector.inImageCode() || !Serializable.class.isAssignableFrom(Class.class)) {
// Let's skip any wrapping attempts if types are generally not serializable in
// the current runtime environment (even java.lang.Class itself, e.g. on Graal)
return providedType;
}
Run Code Online (Sandbox Code Playgroud)
我对第二个检查 ( !Serializable.class.isAssignableFrom(Class.class))很好奇:它是否可以评估为true(即,Serialazable.class不可从 分配Class.class)?
这是Class#isAssignableFrom()javadoc 所说的:
确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。
查看 的代码Class,我看到以下内容:
public final class Class<T> implements java.io.Serializable
Run Code Online (Sandbox Code Playgroud)
Serializable的超级接口也是如此,Class并且应该始终可以从Class. 但是 Spring 代码中的检查表明有时并非如此。
怎么来的?在什么情况下会发生这种情况,为什么它们不违反 Java 语言规范?
与 SpringBoot (3.0.3) 应用程序一起,我们使用 Application Insights (Azure) 进行监控。
目前我们正在尝试使用 GraalVM 本地编译应用程序。这工作得很好,给我们带来了很多好处(启动时间和内存消耗)。唯一还不能工作的是作为 Java 代理启动的 Application Insights。我几乎没有找到关于整个主题的有用信息,并问自己我们是否正在尝试做一些目前根本不支持的事情。
这是我们迄今为止所做的尝试:
nativeCompileGradle 任务的参数指定额外的 jvmArgs(如此处所述: https: //github.com/oracle/graal/issues/1065)。尽管构建工作正常,但它只是不包含(或启动?)应用程序启动时的代理。

是否有解决方案可以在本机编译版本中添加 javaagents,或者是否有任何替代方案可以将监控数据从 SpringBoot 应用程序发送到 ApplicationInsights?
java javaagents spring-boot azure-application-insights graalvm-native-image
我了解了GraalVM和SubstrateVM框架。据我了解,该native-image命令可用于从 Java 源文件创建本机应用程序,如下所示:
$ javac Hello.java
$ native-image --no-server --no-fallback Hello
$ ./hello
Hello World!
$
Run Code Online (Sandbox Code Playgroud)
这将创建一个本机二进制文件hello,根据这个问题,它由 SubstrateVM 框架提供支持,该框架提供了...
...在没有 JVM 的情况下实际运行提前编译的 Java 字节码所需的其他东西(运行时)。
我不清楚:
hello由纯目标机字节码组成,还是仍然有 Java 字节码和嵌入的成熟虚拟机(即 SubstrateVM)?hello相比,运行本机映像需要哪些开销?Hello World!我尝试使用 Kotlin 构建一个简单的应用程序,该应用程序在 GraalVM 本机映像上使用 kotlin.random.Random 类。但这在运行时失败了。堆栈跟踪见下文。
作为解决方法,您可以使用 java 标准 java.util.Random 类。
有人可以告诉我如何使用 Kotlin 类型吗?
应用程序.kt
import kotlin.random.Random
fun main(args: Array<String>) {
println(Random.nextInt())
}
Run Code Online (Sandbox Code Playgroud)
Dockerfile
############################################################################
# Graal Native Image Early-Access Build
#
# Make sure you configured Docker to use at least 6gb ram!
# build from project root dir with: docker build -t example-kotlin-random-graalvm-native:1.0.0-SNAPSHOT .
# run with: docker run -d example-kotlin-random-graalvm-native:1.0.0-SNAPSHOT
############################################################################
#####
# The builder image to build the native app
#####
FROM findepi/graalvm:native as builder …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Micronaut 2.0.0 实现 RESTful API 的小 Java 应用程序。在幕后,它使用 Redisson 3.13.1 转到 Redis。Redisson 反过来使用 Netty (4.1.49)。
该应用程序在“经典”java(在 HotSpot 上,Java 8 和 11)中运行良好。
我正在尝试使用 GraalVM 从此应用程序构建本机映像。
命令大概是这样的:
native-image --no-server --no-fallback -H:+TraceClassInitialization -H:+PrintClassInitialization --report-unsupported-elements-at-runtime --initialize-at-build-time=reactor.core.publisher.Flux,reactor.core.publisher.Mono -H:ConfigurationFileDirectories=target/config -cp target/app-1.0.0-SNAPSHOT.jar com.app.AppApplication target/app
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
Error: Unsupported features in 4 methods
Detailed message:
Error: No instances of java.net.Inet4Address are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized without the native-image initialization instrumentation and the …Run Code Online (Sandbox Code Playgroud) 我想从我的 Compose 桌面应用程序创建一个小型二进制文件。以下是 Compose 的开箱即用选项:
我相信可以使用 GraalVM 将 Uber Jar 转换为本机二进制文件。我还尝试运行 native-image 命令,但它创建了一个 exe,该 exe 又运行 Jar,这又回到了同样的问题;计算机上必须安装 Java 11。我缺少什么?
graalvm ×7
java ×7
aws-lambda ×1
cl.exe ×1
jar ×1
javaagents ×1
kotlin ×1
logback ×1
netty ×1
spring ×1
spring-boot ×1
substratevm ×1
windows ×1