我正在使用当前版本的社区版: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 吗?
我正在读JEP 317.它说Graal(一个新的基于实验Java的JIT编译器)将成为JDK 10的一部分,但后来它说已经在JDK 9中可用了.那么,JEP 317的重点是什么呢?Java 9是否包含Graal?
GraalVM系统显然无法将Spring应用程序编译为本机映像.
我们可以编译Spring应用程序的一个子集 - 比如说,作为一个单独的库 - 然后使用通常的javac编译器编译的其余部分吗?
或者,如果我们从应用程序中省略一些Spring功能?
还有其他可能吗?
我正在尝试从一个胖 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 …
我Nashorn在 Java 11 中使用JavaScript 引擎,它工作正常,但很快就会被弃用。我尝试过GraalVM,我发现它更糟糕,因为执行一个简单的表达式(例如 2+3)需要 13-14 秒。有没有其他替代方法可以使用,或者我应该尝试GraalVM使用其他方法(如果有的话)?
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("javascript");
engine.eval("2+3");
Run Code Online (Sandbox Code Playgroud) GraalVM具有许多令人惊讶的功能。但是我还没有看到但想做的一件事就是能够在浏览器中运行GraalVM应用程序。此类资源(使用GraalVM要做的十件事)显示了与Node.js的互操作,但未在浏览器中运行已编译的应用程序。
这可能吗?如果是这样,是否有相关文档?谢谢!
我正在考虑使用 GraalVM 本机映像编译我的 Java 应用程序,但我所看到的所有文档都提到了减少启动时间,但没有提到整体应用程序性能的改进?
那么,通过这样做,我可以实际期待什么?
在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 语言规范?
我了解了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!