标签: graalvm-native-image

GraalVM(native-image)无法编译logback依赖项

我正在使用当前版本的社区版: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 吗?

java logback graalvm graalvm-native-image

23
推荐指数
1
解决办法
6681
查看次数

/lib64/libc.so.6:找不到版本“GLIBC_2.32”

我正在使用基本示例在 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)

aws-lambda spring-cloud-function graalvm-native-image

20
推荐指数
3
解决办法
4万
查看次数

如何使用 GraalVM native-image 修复“尝试避免初始化导致初始化的类”

我正在尝试从一个胖 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

java jar graalvm graalvm-native-image

12
推荐指数
2
解决办法
2944
查看次数

使用 GraalVM 构建本机应用程序时缺少 cl.exe

我正在尝试使用 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 …

cl.exe graalvm graalvm-native-image

11
推荐指数
4
解决办法
4493
查看次数

Serializable.class 如何不能从 Class.class 分配?

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 语言规范?

java spring graalvm graalvm-native-image

9
推荐指数
1
解决办法
131
查看次数

如何将 Java 代理与本机编译的 Spring Boot 应用程序一起使用

与 SpringBoot (3.0.3) 应用程序一起,我们使用 Application Insights (Azure) 进行监控。

目前我们正在尝试使用 GraalVM 本地编译应用程序。这工作得很好,给我们带来了很多好处(启动时间和内存消耗)。唯一还不能工作的是作为 Java 代理启动的 Application Insights。我几乎没有找到关于整个主题的有用信息,并问自己我们是否正在尝试做一些目前根本不支持的事情。

这是我们迄今为止所做的尝试:

是否有解决方案可以在本机编译版本中添加 javaagents,或者是否有任何替代方案可以将监控数据从 SpringBoot 应用程序发送到 ApplicationInsights?

java javaagents spring-boot azure-application-insights graalvm-native-image

9
推荐指数
1
解决办法
1417
查看次数

本机映像何时以及为何需要 SubstrateVM 框架?

我了解了GraalVMSubstrateVM框架。据我了解,该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 字节码所需的其他东西(运行时)。

我不清楚:

  • 何时以及为何需要 SubstrateVM 框架?仅在本机构建时需要还是在运行时也需要?二进制文件是否hello由纯目标机字节码组成,还是仍然有 Java 字节码和嵌入的成熟虚拟机(即 SubstrateVM)?
  • 与通常的C 程序hello相比,运行本机映像需要哪些开销?Hello World!

java graalvm substratevm graalvm-native-image

8
推荐指数
1
解决办法
1165
查看次数

有没有办法在 GraalVM 本机映像中使用 kotlin.random.Random

我尝试使用 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)

java kotlin graalvm graalvm-native-image

8
推荐指数
1
解决办法
955
查看次数

构建本机映像时,如何调试“映像堆中不允许...的实例”?

我有一个使用 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)

java netty graalvm-native-image

8
推荐指数
1
解决办法
797
查看次数

有没有办法使用 GraalVM 从 Jetpack Compose 桌面应用程序创建本机二进制文件?

我想从我的 Compose 桌面应用程序创建一个小型二进制文件。以下是 Compose 的开箱即用选项:

  1. 使用java运行时创建本机包(很棒,但大小很大)
  2. 创建一个 Uber(fat)Jar(但它需要 Java 11 才能运行,因为 Compose 库不支持旧版本)

我相信可以使用 GraalVM 将 Uber Jar 转换为本机二进制文件。我还尝试运行 native-image 命令,但它创建了一个 exe,该 exe 又运行 Jar,这又回到了同样的问题;计算机上必须安装 Java 11。我缺少什么?

windows graalvm graalvm-native-image jetbrains-compose

7
推荐指数
1
解决办法
1589
查看次数