- Install GraalVM with native-image and set up
GRAALVM_HOME
env variable - Create JBang script with
org.mvnsearch:jbang-spring-native:2.7.1
DEPS
///usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 11+
//DEPS org.mvnsearch:jbang-spring-native:2.7.1
//JAVA_OPTIONS -agentlib:native-image-agent=config-merge-dir=/tmp/native-image-agent
package hello;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Hello implements CommandLineRunner {
public static void main(String... args) {
SpringApplication.run(Hello.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("Hello Spring Native!");
}
}
- Execute
jbang --native Hello.java
//AOT:CONFIG removeXmlSupport=true removeSpelSupport=true
//AOT:CONFIG removeYamlSupport=false
Create Dockerfile
with following code:
FROM linuxchina/jbang-action:0.96.0-graal-java17-22.2.0 as builder
ARG mainClass="SpringBootApp.java"
RUN mkdir -p /opt/app/out
WORKDIR /opt/app
COPY $mainClass /opt/app
RUN jbang export portable --native -O out/main $mainClass
#RUN upx -7 out/main
FROM paketobuildpacks/run:tiny-cnb
COPY --from=builder /opt/app/out /opt/app/out
ENTRYPOINT ["/opt/app/out/main"]
Then execute docker build -t your_name/spring-boot-native .
to create Docker image.
- JBang Build Integration: https://www.jbang.dev/documentation/guide/latest/integration.html
- Spring Native: https://docs.spring.io/spring-native/docs/0.12.0/reference/htmlsingle/
- Native Image Build Configuration: https://www.graalvm.org/22.1/reference-manual/native-image/BuildConfiguration/
- Spring Boot 3 aot: https://github.com/spring-projects/spring-boot/blob/v3.0.0-M4/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AotGenerateMojo.java