Search code examples
spring-bootgraalvmgraalvm-native-image

springboot 3 graalvm native image stuck forever: mac m1


I am using spring boot 3.0.2 and I am using native-maven-plugin.

 <plugin>
       <groupId>org.graalvm.buildtools</groupId>
       <artifactId>native-maven-plugin</artifactId>
       <version>0.9.19</version>
 </plugin>

when I try to build a graalvm native image with this command

./mvnw -Pnative spring-boot:build-image

The process runs for a while and then it is just waiting at this stage forever.

[INFO]     [creator]         Executing native-image -H:+StaticExecutableWithDynamicLibC @/workspace/META-INF/native-image/argfile -H:Name=/layers/paketo-buildpacks_native-image/native-image/com.example.spring6.Spring6Application -cp /workspace:/workspace/BOOT-INF/classes:/workspace/BOOT-INF/lib/spring-boot-3.0.2.jar:/workspace/BOOT-INF/lib/spring-boot-autoconfigure-3.0.2.jar:/workspace/BOOT-INF/lib/logback-classic-1.4.5.jar:/workspace/BOOT-INF/lib/logback-core-1.4.5.jar:/workspace/BOOT-INF/lib/log4j-to-slf4j-2.19.0.jar:/workspace/BOOT-INF/lib/log4j-api-2.19.0.jar:/workspace/BOOT-INF/lib/jul-to-slf4j-2.0.6.jar:/workspace/BOOT-INF/lib/jakarta.annotation-api-2.1.1.jar:/workspace/BOOT-INF/lib/snakeyaml-1.33.jar:/workspace/BOOT-INF/lib/jackson-databind-2.14.1.jar:/workspace/BOOT-INF/lib/jackson-annotations-2.14.1.jar:/workspace/BOOT-INF/lib/jackson-core-2.14.1.jar:/workspace/BOOT-INF/lib/jackson-datatype-jdk8-2.14.1.jar:/workspace/BOOT-INF/lib/jackson-datatype-jsr310-2.14.1.jar:/workspace/BOOT-INF/lib/jackson-module-parameter-names-2.14.1.jar:/workspace/BOOT-INF/lib/tomcat-embed-core-10.1.5.jar:/workspace/BOOT-INF/lib/tomcat-embed-el-10.1.5.jar:/workspace/BOOT-INF/lib/tomcat-embed-websocket-10.1.5.jar:/workspace/BOOT-INF/lib/spring-web-6.0.4.jar:/workspace/BOOT-INF/lib/spring-beans-6.0.4.jar:/workspace/BOOT-INF/lib/micrometer-observation-1.10.3.jar:/workspace/BOOT-INF/lib/micrometer-commons-1.10.3.jar:/workspace/BOOT-INF/lib/spring-webmvc-6.0.4.jar:/workspace/BOOT-INF/lib/spring-aop-6.0.4.jar:/workspace/BOOT-INF/lib/spring-context-6.0.4.jar:/workspace/BOOT-INF/lib/spring-expression-6.0.4.jar:/workspace/BOOT-INF/lib/reactor-netty-http-1.1.2.jar:/workspace/BOOT-INF/lib/netty-codec-http-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-common-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-buffer-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-transport-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-codec-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-handler-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-codec-http2-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-resolver-dns-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-resolver-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-codec-dns-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-resolver-dns-native-macos-4.1.87.Final-osx-x86_64.jar:/workspace/BOOT-INF/lib/netty-resolver-dns-classes-macos-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-transport-native-epoll-4.1.87.Final-linux-x86_64.jar:/workspace/BOOT-INF/lib/netty-transport-native-unix-common-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-transport-classes-epoll-4.1.87.Final.jar:/workspace/BOOT-INF/lib/reactor-netty-core-1.1.2.jar:/workspace/BOOT-INF/lib/netty-handler-proxy-4.1.87.Final.jar:/workspace/BOOT-INF/lib/netty-codec-socks-4.1.87.Final.jar:/workspace/BOOT-INF/lib/spring-webflux-6.0.4.jar:/workspace/BOOT-INF/lib/reactor-core-3.5.2.jar:/workspace/BOOT-INF/lib/reactive-streams-1.0.4.jar:/workspace/BOOT-INF/lib/slf4j-api-2.0.6.jar:/workspace/BOOT-INF/lib/spring-core-6.0.4.jar:/workspace/BOOT-INF/lib/spring-jcl-6.0.4.jar:/workspace/BOOT-INF/lib/spring-boot-jarmode-layertools-3.0.2.jar com.example.spring6.Spring6Application

I am using macbook pro m1. My java version

openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13, mixed mode, sharing)

Solution

  • tl;dr - update your pom.xml to use a different Buildpacks image that properly supports ARM64:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <image>
                <builder>dashaun/builder:tiny</builder>
            </image>
        </configuration>
    </plugin>
    

    The other answer correctly explains how to build a native image, but it does not solve your problem if you wanted to containerize your application - tricky to do as the native image is created for your local host architecture, and would not work if you just copy it to a standard base image. It also requires a local installation of the GraalVM build tools.

    The Spring Boot plugin is solving this problem by building your project in a container, using Buildpacks. Unfortunately, the default Packeto Buildpacks image does not support the Mac M1 architecture (source). Instead, use this base image and it should solve your problem.