[英]Build native-image using graalvm from within gradle after jar is built by running Exec task
[英]GraalVM native image build `nativeCompile` task fails on Gradle after migrating from Java11 to Java17
综上所述,将 Gradle 属性(源/目标)和原生 GraalVM 镜像从 Java11 迁移到 Java17 后,构建任务在 Gradle 失败。
这是一个 micronaut Java 服务,在不泄露任何专有代码库细节的情况下,我分享了我的 Gradle output 失败的“nativeCompile”任务的以下部分:
[1/7] Initializing... (8.0s @ 0.36GB)
Version info: 'GraalVM 22.3.1 Java 17 CE'
Java version info: '17.0.6+10-jvmci-22.3-b13'
C compiler: gcc (redhat, aarch64, 8.5.0)
Garbage collector: Serial GC
6 user-specific feature(s)
- com.oracle.svm.thirdparty.gson.GsonFeature
- io.micronaut.buffer.netty.NettyFeature
- io.micronaut.configuration.kafka.graal.ChecksumFeature
- io.micronaut.grpc.server.graalvm.HttpNettyFeature
- io.micronaut.http.netty.graal.HttpNettyFeature
- io.micronaut.jackson.JacksonDatabindFeature
Fatal error: ------------------------------------------------------------------------------------------------------------------------
0.5s (5.9% of total time) in 12 GCs | Peak RSS: 1.26GB | CPU load: 2.25
========================================================================================================================
java.lang.IllegalAccessError: class io.micronaut.grpc.server.graalvm.HttpNettyFeature (in unnamed module @0x128ca7af) cannot access class com.oracle.svm.core.jdk.SystemPropertiesSupport (in module org.graalvm.nativeimage.builder) because module org.graalvm.nativeimage.builder does not export com.oracle.svm.core.jdk to unnamed module @0x128ca7af
at io.micronaut.grpc.server.graalvm.HttpNettyFeature.beforeAnalysis(HttpNettyFeature.java:84)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$9(NativeImageGenerator.java:736)
Failed generating 'application' after 8.2s.
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:85)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:736)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:578)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:535)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:580)
at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:128)
Error: Image build request failed with exit status 1
> Task :nativeCompile FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':nativeCompile'.
> Process 'command '/opt/graalvm-ce-java17-22.3.1/bin/native-image'' finished with non-zero exit value 1
我没有使用 GraalVM 的经验(这是遗留问题,我在这样创建的容器内运行nativeCompile
:
docker run -it --entrypoint /bin/bash \
--mount type=bind,source=<path to service source code>,target=/app \
--mount type=bind,source=<path to home>.gradle,target=/root/.gradle \
ghcr.io/graalvm/graalvm-ce:ol8-java17-22.3.1
在这个容器上,env 详细信息如下:
bash-4.4# ./gradlew --version
------------------------------------------------------------
Gradle 7.6
------------------------------------------------------------
Build time: 2022-11-25 13:35:10 UTC
Revision: daece9dbc5b79370cc8e4fd6fe4b2cd400e150a8
Kotlin: 1.7.10
Groovy: 3.0.13
Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM: 17.0.6 (GraalVM Community 17.0.6+10-jvmci-22.3-b13)
OS: Linux 5.15.49-linuxkit aarch64
我不知道在这里追求什么,想知道是否有过时的本机依赖项。 我知道我还没有发布我的build.gradle
螺母,希望到目前为止有人可以给我一些指示。
修复。 似乎 GraalVM 发布的更新必须与旧的次要版本同步使用。 我想这是保持本机类兼容的一种方法。
就我而言,较旧的本机映像 gradle 和代码库设置使用的是 ol8-java11-22.1.0,我将其全部更新为最新可用的 ol8-java17-23.2.1。 这打破了构建。
但是,GraalVM 还发布了 ol8-java17-22.1.0,它与旧的次要版本相匹配。 这没有任何问题,构建成功。
我直接使用native-image
命令构建原生镜像,而不是通过 gradle 插件。 我在将 graalvm 从22.1.0
升级到22.3.2
时遇到了这个问题。 将参数-J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk=ALL-UNNAMED
添加到 native-image 命令修复它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.