You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:27:11