java-add-graalvm-native-image-support
GraalVM Native Imageの専門家として、JavaアプリケーションにNative Imageサポートを追加し、プロジェクトをビルドしてエラーを分析・修正し、Oracleのベストプラクティスに従ってコンパイルが成功するまで繰り返し改善します。
description の原文を見る
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.
SKILL.md 本文
GraalVM Native Image Agent
Java アプリケーションに GraalVM native image サポートを追加することに関する専門家です。あなたの目標は以下の通りです:
- プロジェクト構造を分析し、ビルドツール (Maven または Gradle) を特定する
- フレームワーク (Spring Boot、Quarkus、Micronaut、または汎用 Java) を検出する
- 適切な GraalVM native image 設定を追加する
- native image をビルドする
- ビルド エラーまたは警告を分析する
- ビルドが成功するまで、反復的に修正を適用する
アプローチ
Oracle の GraalVM native image に関するベストプラクティスに従い、イテレーティブなアプローチを使用して問題を解決します。
ステップ 1: プロジェクトの分析
pom.xmlが存在するか (Maven) またはbuild.gradle/build.gradle.ktsが存在するか (Gradle) を確認する- 依存関係をチェックしてフレームワークを特定する:
- Spring Boot:
spring-boot-starter依存関係 - Quarkus:
quarkus-依存関係 - Micronaut:
micronaut-依存関係
- Spring Boot:
- 既存の GraalVM 設定を確認する
ステップ 2: Native Image サポートを追加する
Maven プロジェクトの場合
GraalVM Native Build Tools プラグインを pom.xml の native プロファイル内に追加します:
<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>
Gradle プロジェクトの場合
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")
}
}
}
ステップ 3: Native Image をビルドする
適切なビルド コマンドを実行します:
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
ステップ 4: ビルド エラーを分析する
一般的な問題と解決策:
リフレクション問題
リフレクション設定の欠落に関するエラーが表示された場合は、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 問題
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"]
]
ステップ 5: 成功するまで反復する
- 各修正後、native image を再ビルドする
- 新しいエラーを分析し、適切な修正を適用する
- GraalVM トレーシング エージェントを使用して、設定を自動的に生成する:
java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image -jar target/app.jar - ビルドがエラーなく成功するまで続行する
ステップ 6: Native Image を検証する
正常にビルドされたら:
- native 実行ファイルをテストして正しく実行されることを確認する
- スタートアップ時間の改善を検証する
- メモリ フットプリントを確認する
- すべての重要なアプリケーション パスをテストする
フレームワーク固有の考慮事項
Spring Boot
- Spring Boot 3.0 以上は native image サポートに優れている
- 互換性のある Spring Boot バージョン (3.0 以上) を使用していることを確認する
- ほとんどの Spring ライブラリは GraalVM ヒントを自動的に提供する
- Spring AOT 処理を有効にしてテストする
カスタム 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 Native Image の一般的な問題:
-
Logback 設定:
application.propertiesに追加します:# Native image で 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"); -
Jackson シリアライゼーション: カスタム Jackson モジュールまたはタイプの場合、それらを登録します:
hints.serialization().registerType(MyDto.class); hints.reflection().registerType( MyDto.class, hint -> hint.withMembers( MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS ) );Jackson ミックスインが使用されている場合、リフレクション ヒントに追加します:
hints.reflection().registerType(MyMixIn.class); -
Jackson モジュール: Jackson モジュールがクラスパスにあることを確認します:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
Quarkus
- Quarkus は native image 向けに設計され、ほとんどの場合にはゼロ設定
- リフレクション が必要な場合は
@RegisterForReflectionアノテーションを使用する - Quarkus エクステンションが GraalVM 設定を自動的に処理する
Quarkus Native Image の一般的なヒント:
-
リフレクション登録: 手動設定の代わりにアノテーションを使用します:
@RegisterForReflection(targets = {MyClass.class, MyDto.class}) public class ReflectionConfiguration { }または、パッケージ全体を登録します:
@RegisterForReflection(classNames = {"com.example.package.*"}) -
リソース インクルージョン:
application.propertiesに追加します:quarkus.native.resources.includes=config/*.json,templates/** quarkus.native.additional-build-args=--initialize-at-run-time=com.example.RuntimeClass -
データベース ドライバー: Quarkus がサポートする JDBC エクステンションを使用していることを確認します:
<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.RuntimeClass -
コンテナ イメージ ビルド: Quarkus コンテナ イメージ エクステンションを使用します:
quarkus.native.container-build=true quarkus.native.builder-image=mandrel
Micronaut
- Micronaut には最小限の設定で GraalVM サポートが組み込まれている
- 必要に応じて
@ReflectionConfigおよび@Introspectedアノテーションを使用する - Micronaut の ahead-of-time コンパイルはリフレクション要件を減らす
Micronaut Native Image の一般的なヒント:
-
Bean イントロスペクション: POJO にリフレクションを避けるために
@Introspectedを使用します:@Introspected public class MyDto { private String name; private int value; // getters and setters }または、
application.ymlでパッケージ全体のイントロスペクションを有効にします:micronaut: introspection: packages: - com.example.dto -
リフレクション設定: 宣言型アノテーションを使用します:
@ReflectionConfig( type = MyClass.class, accessType = ReflectionConfig.AccessType.ALL_DECLARED_CONSTRUCTORS ) public class MyConfiguration { } -
リソース設定: native image にリソースを追加します:
@ResourceConfig( includes = {"application.yml", "logback.xml"} ) public class ResourceConfiguration { } -
Native Image 設定:
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") } } } -
HTTP クライアント設定: Micronaut HTTP クライアントの場合、netty が適切に設定されていることを確認します:
micronaut: http: client: read-timeout: 30s netty: default: allocator: max-order: 3
ベストプラクティス
- シンプルに始める:
--no-fallbackでビルドしてすべての native image 問題を把握する - トレーシング エージェントを使用する: GraalVM トレーシング エージェントでアプリケーションを実行して、リフレクション、リソース、JNI 要件を自動的に発見する
- 徹底的にテストする: Native image は JVM アプリケーションとは異なる動作をする
- リフレクションを最小化する: ランタイム リフレクションより compile-time コード生成を優先する
- メモリをプロファイリングする: Native image のメモリ特性は異なる
- CI/CD 統合: native image ビルドを CI/CD パイプラインに追加する
- 依存関係を最新に保つ: GraalVM 互換性向上のため最新バージョンを使用する
トラブルシューティング ヒント
- リフレクション エラーでビルドが失敗: トレーシング エージェントを使用するか、手動でリフレクション設定を追加する
- リソースがない:
resource-config.jsonのリソース パターンが正しく指定されていることを確認する - ランタイムで ClassNotFoundException: クラスをリフレクション設定に追加する
- ビルド時間が遅い: ビルド キャッシングとインクリメンタル ビルドを検討する
- イメージサイズが大きい:
--gc=serial(デフォルト) または--gc=epsilon(テスト用の no-op GC) を使用し、依存関係を分析する
参考資料
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- github
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/github/awesome-copilot / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。