The following application (created using https://start.spring.io with "GraalVM native support" added) fails when built using the "bootBuildImage" Gradle task:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @PostConstruct
    public void checkAwt() {
      System.out.println(Arrays.toString(ImageIO.getReaderFormatNames()));
    }
}

Relevant bits from build.gradle:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.3'
    id 'org.graalvm.buildtools.native' version '0.9.27'
}
...
java {
    sourceCompatibility = '17'
}

Stacktrace:

...
2023-10-23 21:13:26 Caused by: java.lang.UnsatisfiedLinkError: no awt in java.library.path
2023-10-23 21:13:26     at com.oracle.svm.core.jdk.NativeLibrarySupport.loadLibraryRelative(NativeLibrarySupport.java:136) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.lang.ClassLoader.loadLibrary(ClassLoader.java:50) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.lang.Runtime.loadLibrary0(Runtime.java:818) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.lang.System.loadLibrary(System.java:1989) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/java.awt.Toolkit$2.run(Toolkit.java:1388) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/java.awt.Toolkit$2.run(Toolkit.java:1386) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.security.AccessController.executePrivileged(AccessController.java:171) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/java.awt.Toolkit.loadLibraries(Toolkit.java:1385) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/java.awt.Toolkit.initStatic(Toolkit.java:1423) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/java.awt.Toolkit.<clinit>(Toolkit.java:1397) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.lang.Class.ensureInitialized(DynamicHub.java:579) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/sun.awt.AppContext$2.run(AppContext.java:273) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/sun.awt.AppContext$2.run(AppContext.java:262) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.security.AccessController.executePrivileged(AccessController.java:171) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/sun.awt.AppContext.initMainAppContext(AppContext.java:262) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/sun.awt.AppContext$3.run(AppContext.java:315) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/sun.awt.AppContext$3.run(AppContext.java:298) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.security.AccessController.executePrivileged(AccessController.java:171) ~[na:na]
2023-10-23 21:13:26     at java.base@17.0.7/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/sun.awt.AppContext.getAppContext(AppContext.java:297) ~[com.example.springbootawtnative.DemoApplication:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:129) ~[na:na]
2023-10-23 21:13:26     at java.desktop@17.0.7/javax.imageio.ImageIO.<clinit>(ImageIO.java:66) ~[na:na]
2023-10-23 21:13:26     at com.example.springbootawtnative.DemoApplication.checkAwt(DemoApplication.java:21) ~[com.example.springbootawtnative.DemoApplication:na]

Expected result: same as with "bootRun" Gradle task, outputs non-empty list of supported image formats.

Comment From: wilkinsona

Unfortunately, using AWT with Graal isn't easy but that's out of Spring Boot's control. You may found some useful suggestions in https://github.com/oracle/graal/issues/2842.