java-add-graalvm-native-image-support by github/awesome-copilot
npx skills add https://github.com/github/awesome-copilot --skill java-add-graalvm-native-image-support您是一位为 Java 应用程序添加 GraalVM 原生镜像支持的专家。您的目标是:
遵循 Oracle 关于 GraalVM 原生镜像的最佳实践,并使用迭代方法解决问题。
pom.xml(Maven)或 build.gradle/build.gradle.kts(Gradle)spring-boot-starter 依赖项quarkus- 依赖项micronaut- 依赖项广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
在 pom.xml 的 native 配置文件中添加 GraalVM Native Build Tools 插件:
<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>
对于 Spring Boot 项目,确保 Spring Boot Maven 插件在主构建部分:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
将 GraalVM Native Build Tools 插件添加到 build.gradle:
plugins {
id 'org.graalvm.buildtools.native' version '[latest-version]'
}
graalvmNative {
binaries {
main {
imageName = project.name
mainClass = application.mainClass.get()
buildArgs.add('--no-fallback')
}
}
}
或对于 Kotlin DSL(build.gradle.kts):
plugins {
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")
}
}
}
运行适当的构建命令:
Maven:
mvn -Pnative native:compile
Gradle:
./gradlew nativeCompile
Spring Boot (Maven):
mvn -Pnative spring-boot:build-image
Quarkus (Maven):
./mvnw package -Pnative
Micronaut (Maven):
./mvnw package -Dpackaging=native-image
常见问题及解决方案:
如果看到关于缺少反射配置的错误,请创建或更新 src/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"}
]
}
}
对于 JNI 相关的错误,创建 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"]
]
每次修复后,重新构建原生镜像
分析新的错误并应用适当的修复
使用 GraalVM 追踪代理自动生成配置:
java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image -jar target/app.jar
持续进行,直到构建成功且没有错误
构建成功后:
何时添加自定义 RuntimeHints:
仅在需要注册自定义提示时创建 RuntimeHintsRegistrar 实现:
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
public class MyRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
// 注册反射提示
hints.reflection().registerType(
MyClass.class,
hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
MemberCategory.INVOKE_DECLARED_METHODS)
);
// 注册资源提示
hints.resources().registerPattern("custom-config/*.properties");
// 注册序列化提示
hints.serialization().registerType(MySerializableClass.class);
}
}
在主应用程序类中注册它:
@SpringBootApplication
@ImportRuntimeHints(MyRuntimeHints.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
常见的 Spring Boot 原生镜像问题:
Logback 配置 :添加到 application.properties:
# 在原生镜像中禁用 Logback 的关闭钩子
logging.register-shutdown-hook=false
如果使用自定义 Logback 配置,请确保 logback-spring.xml 在资源中,并添加到 RuntimeHints:
hints.resources().registerPattern("logback-spring.xml");
hints.resources().registerPattern("org/springframework/boot/logging/logback/*.xml");
2. Jackson 序列化 :对于自定义 Jackson 模块或类型,请注册它们:
hints.serialization().registerType(MyDto.class);
hints.reflection().registerType(
MyDto.class,
hint -> hint.withMembers(
MemberCategory.DECLARED_FIELDS,
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS
)
);
如果使用 Jackson mix-ins,请将其添加到反射提示中:
hints.reflection().registerType(MyMixIn.class);
3. Jackson 模块 :确保 Jackson 模块在类路径上:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
@RegisterForReflection 注解常见的 Quarkus 原生镜像提示:
反射注册 :使用注解代替手动配置:
@RegisterForReflection(targets = {MyClass.class, MyDto.class})
public class ReflectionConfiguration {
}
或注册整个包:
@RegisterForReflection(classNames = {"com.example.package.*"})
2. 资源包含 :添加到 application.properties:
quarkus.native.resources.includes=config/*.json,templates/**
quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClass
3. 数据库驱动 :确保您使用的是 Quarkus 支持的 JDBC 扩展:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
4. 构建时与运行时初始化 :控制初始化:
quarkus.native.additional-build-args=--initialize-at-build-time=com.example.BuildTimeClass
quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClass
5. 容器镜像构建 :使用 Quarkus 容器镜像扩展:
quarkus.native.container-build=true
quarkus.native.builder-image=mandrel
@ReflectionConfig 和 @Introspected 注解常见的 Micronaut 原生镜像提示:
Bean 内省 :对 POJO 使用 @Introspected 以避免反射:
@Introspected
public class MyDto {
private String name;
private int value;
// getters and setters
}
或在 application.yml 中启用包范围的内省:
micronaut:
introspection:
packages:
- com.example.dto
2. 反射配置 :使用声明式注解:
@ReflectionConfig(
type = MyClass.class,
accessType = ReflectionConfig.AccessType.ALL_DECLARED_CONSTRUCTORS
)
public class MyConfiguration {
}
3. 资源配置 :将资源添加到原生镜像:
@ResourceConfig(
includes = {"application.yml", "logback.xml"}
)
public class ResourceConfiguration {
}
4. 原生镜像配置 :在 build.gradle 中:
graalvmNative {
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")
}
}
}
5. HTTP 客户端配置 :对于 Micronaut HTTP 客户端,确保 netty 配置正确:
micronaut:
http:
client:
read-timeout: 30s
netty:
default:
allocator:
max-order: 3
--no-fallback 构建以捕获所有原生镜像问题resource-config.json 中正确指定--gc=serial(默认)或 --gc=epsilon(用于测试的无操作 GC)并分析依赖项每周安装数
7.3K
仓库
GitHub 星标数
26.7K
首次出现
2026年2月25日
安全审计
安装于
codex7.2K
gemini-cli7.2K
opencode7.2K
cursor7.2K
github-copilot7.2K
kimi-cli7.2K
You are an expert in adding GraalVM native image support to Java applications. Your goal is to:
Follow Oracle's best practices for GraalVM native images and use an iterative approach to resolve issues.
pom.xml exists (Maven) or build.gradle/build.gradle.kts exists (Gradle)spring-boot-starter dependenciesquarkus- dependenciesmicronaut- dependenciesAdd the GraalVM Native Build Tools plugin within a native profile in pom.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>
For Spring Boot projects, ensure the Spring Boot Maven plugin is in the main build section:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Add the GraalVM Native Build Tools plugin to build.gradle:
plugins {
id 'org.graalvm.buildtools.native' version '[latest-version]'
}
graalvmNative {
binaries {
main {
imageName = project.name
mainClass = application.mainClass.get()
buildArgs.add('--no-fallback')
}
}
}
Or for Kotlin DSL (build.gradle.kts):
plugins {
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")
}
}
}
Run the appropriate build command:
Maven:
mvn -Pnative native:compile
Gradle:
./gradlew nativeCompile
Spring Boot (Maven):
mvn -Pnative spring-boot:build-image
Quarkus (Maven):
./mvnw package -Pnative
Micronaut (Maven):
./mvnw package -Dpackaging=native-image
Common issues and solutions:
If you see errors about missing reflection configuration, create or update src/main/resources/META-INF/native-image/reflect-config.json:
[
{
"name": "com.example.YourClass",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"allDeclaredFields": true
}
]
For missing resources, create src/main/resources/META-INF/native-image/resource-config.json:
{
"resources": {
"includes": [
{"pattern": "application.properties"},
{"pattern": ".*\\.yml"},
{"pattern": ".*\\.yaml"}
]
}
}
For JNI-related errors, create src/main/resources/META-INF/native-image/jni-config.json:
[
{
"name": "com.example.NativeClass",
"methods": [
{"name": "nativeMethod", "parameterTypes": ["java.lang.String"]}
]
}
]
For dynamic proxy errors, create src/main/resources/META-INF/native-image/proxy-config.json:
[
["com.example.Interface1", "com.example.Interface2"]
]
After each fix, rebuild the native image
Analyze new errors and apply appropriate fixes
Use the GraalVM tracing agent to automatically generate configuration:
java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image -jar target/app.jar
Continue until the build succeeds without errors
Once built successfully:
When to Add Custom RuntimeHints:
Create a RuntimeHintsRegistrar implementation only if you need to register custom hints:
import 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);
}
}
Register it in your main application class:
@SpringBootApplication
@ImportRuntimeHints(MyRuntimeHints.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Common Spring Boot Native Image Issues:
Logback Configuration : Add to application.properties:
# Disable Logback's shutdown hook in native images
logging.register-shutdown-hook=false
If using custom Logback configuration, ensure logback-spring.xml is in resources and add to RuntimeHints:
hints.resources().registerPattern("logback-spring.xml");
hints.resources().registerPattern("org/springframework/boot/logging/logback/*.xml");
2. Jackson Serialization : For custom Jackson modules or types, register them:
hints.serialization().registerType(MyDto.class);
hints.reflection().registerType(
MyDto.class,
hint -> hint.withMembers(
MemberCategory.DECLARED_FIELDS,
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS
)
);
Add Jackson mix-ins to reflection hints if used:
hints.reflection().registerType(MyMixIn.class);
3. Jackson Modules : Ensure Jackson modules are on the classpath:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
@RegisterForReflection annotation for reflection needsCommon Quarkus Native Image Tips:
Reflection Registration : Use annotations instead of manual configuration:
@RegisterForReflection(targets = {MyClass.class, MyDto.class})
public class ReflectionConfiguration {
}
Or register entire packages:
@RegisterForReflection(classNames = {"com.example.package.*"})
2. Resource Inclusion : Add to application.properties:
quarkus.native.resources.includes=config/*.json,templates/**
quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClass
3. Database Drivers : Ensure you're using Quarkus-supported JDBC extensions:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
4. Build-Time vs Runtime Initialization : Control initialization with:
quarkus.native.additional-build-args=--initialize-at-build-time=com.example.BuildTimeClass
quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClass
5. Container Image Build : Use Quarkus container-image extensions:
quarkus.native.container-build=true
quarkus.native.builder-image=mandrel
@ReflectionConfig and @Introspected annotations as neededCommon Micronaut Native Image Tips:
Bean Introspection : Use @Introspected for POJOs to avoid reflection:
@Introspected
public class MyDto {
private String name;
private int value;
// getters and setters
}
Or enable package-wide introspection in application.yml:
micronaut:
introspection:
packages:
- com.example.dto
2. Reflection Configuration : Use declarative annotations:
@ReflectionConfig(
type = MyClass.class,
accessType = ReflectionConfig.AccessType.ALL_DECLARED_CONSTRUCTORS
)
public class MyConfiguration {
}
3. Resource Configuration : Add resources to native image:
@ResourceConfig(
includes = {"application.yml", "logback.xml"}
)
public class ResourceConfiguration {
}
4. Native Image Configuration : In build.gradle:
graalvmNative {
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")
}
}
}
5. HTTP Client Configuration : For Micronaut HTTP clients, ensure netty is properly configured:
micronaut:
http:
client:
read-timeout: 30s
netty:
default:
allocator:
max-order: 3
--no-fallback to catch all native image issuesresource-config.json--gc=serial (default) or --gc=epsilon (no-op GC for testing) and analyze dependenciesWeekly Installs
7.3K
Repository
GitHub Stars
26.7K
First Seen
Feb 25, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex7.2K
gemini-cli7.2K
opencode7.2K
cursor7.2K
github-copilot7.2K
kimi-cli7.2K
97,600 周安装