Micronaut默认配置下GraalVM原生打包失败问题求助
Micronaut项目GraalVM原生打包报错问题
问题描述
使用IDEA新建默认配置的Micronaut项目(未选择任何额外组件),执行GraalVM原生打包时持续报错。
首次报错日志
[native-image-plugin] GraalVM Toolchain detection is disabled [native-image-plugin] GraalVM location read from environment variable: GRAALVM_HOME [native-image-plugin] Native Image executable path: D:\Program Files\graaLvm_fx17\bin\native-image.cmd Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 6 Files\gradle-8.5\caches\modules-2\files-2.1\io.netty\netty-codec-http\4.1.106.Final\21a07cdf0fc46b313fe2248f1275cdbdac0ba87b\netty-codec-http-4.1.106.Final.jar\E ^ at java.util.regex.Pattern.error(Pattern.java:2028) at java.util.regex.Pattern.escape(Pattern.java:2608) at java.util.regex.Pattern.atom(Pattern.java:2286) at java.util.regex.Pattern.sequence(Pattern.java:2210) at java.util.regex.Pattern.expr(Pattern.java:2069) at java.util.regex.Pattern.compile(Pattern.java:1783) at java.util.regex.Pattern.<init>(Pattern.java:1430) at java.util.regex.Pattern.compile(Pattern.java:1069) at com.oracle.svm.driver.DefaultOptionHandler.consume(DefaultOptionHandler.java:209) at com.oracle.svm.driver.NativeImage$NativeImageArgsProcessor.apply(NativeImage.java:1463) at com.oracle.svm.driver.DefaultOptionHandler.consume(DefaultOptionHandler.java:324) at com.oracle.svm.driver.NativeImage$NativeImageArgsProcessor.apply(NativeImage.java:1463) at com.oracle.svm.driver.NativeImage.processNativeImageArgs(NativeImage.java:1718) at com.oracle.svm.driver.NativeImage.completeImageBuild(NativeImage.java:936) at com.oracle.svm.driver.NativeImage.build(NativeImage.java:1380) at com.oracle.svm.driver.NativeImage.performBuild(NativeImage.java:1350) at com.oracle.svm.driver.NativeImage.main(NativeImage.java:1337)
build.gradle 配置内容
(因网络问题删除项目仓库设置,使用全局配置)
plugins { id("com.github.johnrengelman.shadow") version "8.1.1" id("io.micronaut.application") version "4.3.1" id("io.micronaut.aot") version "4.3.1" } version = "0.1" group = "com.example" dependencies { annotationProcessor("io.micronaut:micronaut-http-validation") annotationProcessor("io.micronaut.serde:micronaut-serde-processor") implementation("io.micronaut.serde:micronaut-serde-jackson") compileOnly("io.micronaut:micronaut-http-client") runtimeOnly("ch.qos.logback:logback-classic") testImplementation("io.micronaut:micronaut-http-client") implementation("com.github.librepdf:openpdf:1.3.35") } application { mainClass.set("com.example.Application") } java { sourceCompatibility = JavaVersion.toVersion("17") targetCompatibility = JavaVersion.toVersion("17") } graalvmNative.toolchainDetection = false micronaut { runtime("netty") testRuntime("junit5") processing { incremental(true) annotations("com.example.*") } aot { // Please review carefully the optimizations enabled below // Check https://micronaut-projects.github.io/micronaut-aot/latest/guide/ for more details optimizeServiceLoading = false convertYamlToJava = false precomputeOperations = true cacheEnvironment = true optimizeClassLoading = true deduceEnvironment = true optimizeNetty = true } }
环境信息
openjdk version "17.0.3" 2022-04-19 OpenJDK Runtime Environment GraalVM 22.1.0.1 (build 17.0.3+7-jvmci-22.1-b06) OpenJDK 64-Bit Server VM GraalVM 22.1.0.1 (build 17.0.3+7-jvmci-22.1-b06, mixed mode, sharing) gradle 8.5 windows 11 wix 3.11
尝试操作及二次报错
已尝试:
- 使用JDK21版本的GraalVM,以及Oracle和社区版JDK17版本的GraalVM,均失败
- 构建fat jar后手动执行原生编译,仍然失败,报错如下:
Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing io.netty.util.ResourceLeakDetectorFactory$DefaultResourceLeakDetectorFactory.newResourceLeakDetector(java.lang.Class, int) Parsing context: at io.netty.util.ResourceLeakDetectorFactory$DefaultResourceLeakDetectorFactory.newResourceLeakDetector(ResourceLeakDetectorFactory.java:180) at io.netty.util.ResourceLeakDetectorFactory.newResourceLeakDetector(ResourceLeakDetectorFactory.java:63)
解决方案建议
1. 解决路径转义问题
首次报错核心是Windows路径中的空格和未转义的反斜杠导致正则解析失败:
- 将GraalVM安装到无空格的路径下,比如
D:\graalvm_fx17,避免路径含空格引发的转义异常 - 修改Gradle全局配置,将缓存目录迁移到无空格路径(可通过
GRADLE_USER_HOME环境变量设置)
2. 解决Netty原生编译兼容性问题
二次报错是Netty的ResourceLeakDetector在GraalVM编译时的解析失败,可尝试:
- 升级Micronaut版本至4.4及以上,新版本对Netty的GraalVM支持做了优化
- 在
build.gradle的GraalVM配置中添加参数:graalvmNative { binaries { main { buildArgs.add("-H:+AllowFoldMethods") } } } - 检查OpenPDF是否支持GraalVM原生编译,若不兼容可替换为原生友好的PDF库
- 禁用Netty的ResourceLeakDetector,在启动参数中添加
-Dio.netty.leakDetection.level=disabled
内容的提问来源于stack exchange,提问作者CXVV
相关产品推荐
相关产品推荐

