Loading...
Loading...
GraalVM Native Image expert that adds native image support to Java applications, builds the project, analyzes build errors, applies fixes, and iterates until successful compilation using Oracle best practices.
npx skill4agent add github/awesome-copilot java-add-graalvm-native-image-supportpom.xmlbuild.gradlebuild.gradle.ktsspring-boot-starterquarkus-micronaut-nativepom.xml<profiles>
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>[latest-version]</version>
<extensions>true</extensions>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<imageName>${project.artifactId}</imageName>
<mainClass>${main.class}</mainClass>
<buildArgs>
<buildArg>--no-fallback</buildArg>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles><build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>build.gradleplugins {
id 'org.graalvm.buildtools.native' version '[latest-version]'
}
graalvmNative {
binaries {
main {
imageName = project.name
mainClass = application.mainClass.get()
buildArgs.add('--no-fallback')
}
}
}build.gradle.ktsplugins {
id("org.graalvm.buildtools.native") version "[latest-version]"
}
graalvmNative {
binaries {
named("main") {
imageName.set(project.name)
mainClass.set(application.mainClass.get())
buildArgs.add("--no-fallback")
}
}
}mvn -Pnative native:compile./gradlew nativeCompilemvn -Pnative spring-boot:build-image./mvnw package -Pnative./mvnw package -Dpackaging=native-imagesrc/main/resources/META-INF/native-image/reflect-config.json[
{
"name": "com.example.YourClass",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"allDeclaredFields": true
}
]src/main/resources/META-INF/native-image/resource-config.json{
"resources": {
"includes": [
{"pattern": "application.properties"},
{"pattern": ".*\\.yml"},
{"pattern": ".*\\.yaml"}
]
}
}src/main/resources/META-INF/native-image/jni-config.json[
{
"name": "com.example.NativeClass",
"methods": [
{"name": "nativeMethod", "parameterTypes": ["java.lang.String"]}
]
}
]src/main/resources/META-INF/native-image/proxy-config.json[
["com.example.Interface1", "com.example.Interface2"]
]java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image -jar target/app.jarRuntimeHintsRegistrarimport org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
public class MyRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
// Register reflection hints
hints.reflection().registerType(
MyClass.class,
hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
MemberCategory.INVOKE_DECLARED_METHODS)
);
// Register resource hints
hints.resources().registerPattern("custom-config/*.properties");
// Register serialization hints
hints.serialization().registerType(MySerializableClass.class);
}
}@SpringBootApplication
@ImportRuntimeHints(MyRuntimeHints.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}application.properties# Disable Logback's shutdown hook in native images
logging.register-shutdown-hook=falselogback-spring.xmlRuntimeHintshints.resources().registerPattern("logback-spring.xml");
hints.resources().registerPattern("org/springframework/boot/logging/logback/*.xml");hints.serialization().registerType(MyDto.class);
hints.reflection().registerType(
MyDto.class,
hint -> hint.withMembers(
MemberCategory.DECLARED_FIELDS,
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS
)
);hints.reflection().registerType(MyMixIn.class);<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>@RegisterForReflection@RegisterForReflection(targets = {MyClass.class, MyDto.class})
public class ReflectionConfiguration {
}@RegisterForReflection(classNames = {"com.example.package.*"})application.propertiesquarkus.native.resources.includes=config/*.json,templates/**
quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClass<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>quarkus.native.additional-build-args=--initialize-at-build-time=com.example.BuildTimeClass
quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClassquarkus.native.container-build=true
quarkus.native.builder-image=mandrel@ReflectionConfig@Introspected@Introspected@Introspected
public class MyDto {
private String name;
private int value;
// getters and setters
}application.ymlmicronaut:
introspection:
packages:
- com.example.dto@ReflectionConfig(
type = MyClass.class,
accessType = ReflectionConfig.AccessType.ALL_DECLARED_CONSTRUCTORS
)
public class MyConfiguration {
}@ResourceConfig(
includes = {"application.yml", "logback.xml"}
)
public class ResourceConfiguration {
}build.gradlegraalvmNative {
binaries {
main {
buildArgs.add("--initialize-at-build-time=io.micronaut")
buildArgs.add("--initialize-at-run-time=io.netty")
buildArgs.add("--report-unsupported-elements-at-runtime")
}
}
}micronaut:
http:
client:
read-timeout: 30s
netty:
default:
allocator:
max-order: 3--no-fallbackresource-config.json--gc=serial--gc=epsilon