spring-bootdockermavengraalvm-native-imagebuildpack

Can not build Cloud Native image using spring boot 3.4.4 and Maven on Windows


I have configured POM according to spring boot documentation https://docs.spring.io/spring-boot/how-to/native-image/developing-your-first-application.html

GraalVM and native image is installed.

Docker is installed and is working in Linux Containers mode.

When doing: mvn -Pnative spring-boot:build-image

I am getting:

[INFO] --- spring-boot:3.4.4:build-image (default-cli) @ sms-sender-service ---
[INFO] Building image 'docker.io/library/my-service:0.0.1-SNAPSHOT'
[INFO]
[INFO]  > Pulling builder image 'docker.io/paketobuildpacks/builder-jammy-java-tiny:latest' 100%
[INFO]  > Pulled builder image 'paketobuildpacks/builder-jammy-java-tiny@sha256:cbd65c21bc53832bd81932f9f52e650b275a6aa82fd30702f523907385a4788e'
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  31.079 s
[INFO] Finished at: 2025-05-04T06:00:39+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.4.4:build-image (default-cli) on project my-service: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:3.4.4:build-image failed: OS must not be empty -> [Help 1]

Please see POM.XML below:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.4</version>
        <relativePath/>
    </parent>

    <groupId>com.my.service</groupId>
    <artifactId>my-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>my-service</name>
    <description>my-service</description>

    <properties>
        <java.version>21</java.version>

        <!-- Dependency Versions -->
        <aws.sdk.version>2.31.29</aws.sdk.version>
        <log4j2.aws.appenders.version>3.2.1</log4j2.aws.appenders.version>
        <jakarta.bind.version>4.0.2</jakarta.bind.version>
        <jaxb.runtime.version>4.0.5</jaxb.runtime.version>
        <mapstruct.version>1.6.3</mapstruct.version>
        <lombok.version>1.18.30</lombok.version>
        <lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
        <commons.lang3.version>3.17.0</commons.lang3.version>
        <commons.collections4.version>4.5.0</commons.collections4.version>
        <hibernate.validator.version>9.0.0.CR1</hibernate.validator.version>
        <jakarta.validation.api.version>3.1.1</jakarta.validation.api.version>
        <resilience4j.version>2.3.0</resilience4j.version>
        <springdoc.openapi.version>2.8.6</springdoc.openapi.version>
        <stubrunner.version>4.2.1</stubrunner.version>
        <rest.assured.version>5.5.1</rest.assured.version>

        <!-- Plugin Versions -->
        <maven.compiler.plugin.version>3.10.1</maven.compiler.plugin.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Starters -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>   
      
    <build>
        <finalName>my-service</finalName>
        <plugins>
            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>${lombok.mapstruct.binding.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
</project>

Solution

  • This was a bug caused by a change in Docker behavior. It has been fixed in Spring Boot 3.4.5 (and other supported versions).

    https://github.com/spring-projects/spring-boot/issues/45152