Agent Skills by ALSEL
Anthropic Claudeその他⭐ リポ 0品質スコア 50/100

graalvm-native-image

JavaアプリケーションからGraalVM Native Imageの実行バイナリを構築するための専門的なガイダンスを提供します。JVMアプリケーションのネイティブバイナリへの変換、コールドスタート時間の最適化、メモリフットプリントの削減、MavenやGradle向けのネイティブビルドツールの設定、ネイティブビルドにおけるリフレクションやリソースの問題解決、またはSpring Boot・Quarkus・Micronautにおけるフレームワーク固有のネイティブサポートの実装が必要な場面で活用してください。

description の原文を見る

Provides expert guidance for building GraalVM Native Image executables from Java applications. Use when converting JVM applications to native binaries, optimizing cold start times, reducing memory footprint, configuring native build tools for Maven or Gradle, resolving reflection and resource issues in native builds, or implementing framework-specific native support for Spring Boot, Quarkus, and Micronaut. Triggers include "graalvm native image", "native executable java", "java cold start optimization", "native build tools", "ahead of time compilation java", "reflection config graalvm", "native image build failure".

SKILL.md 本文

GraalVM Native Image for Java アプリケーション

GraalVM Native Image を使用して Java アプリケーションから高性能なネイティブ実行可能ファイルを構築し、起動時間とメモリ消費量を大幅に削減するエキスパートスキル。

概要

GraalVM Native Image は Java アプリケーションを事前にコンパイル(AOT)してスタンドアロンのネイティブ実行可能ファイルに変換します。これらの実行可能ファイルはミリ秒単位で起動し、JVM ベースのデプロイメントよりも大幅に少ないメモリを必要とし、サーバーレス関数、CLI ツール、および高速起動と低リソース使用が重要なマイクロサービスに最適です。

このスキルは、ビルドツール設定、フレームワーク固有のパターン、リフレクションメタデータ管理をカバーする、JVM アプリケーションをネイティブバイナリに移行するための構造化されたワークフローを提供し、ネイティブビルドの失敗を解決するための反復的なアプローチを含みます。

使用時期

このスキルは以下の場合に使用してください:

  • JVM ベースの Java アプリケーションを GraalVM ネイティブ実行可能ファイルに変換する
  • サーバーレスまたはコンテナ化されたデプロイメントの冷起動時間を最適化する
  • Java マイクロサービスのメモリフットプリント(RSS)を削減する
  • GraalVM Native Build Tools で Maven または Gradle を構成する
  • ネイティブビルドで ClassNotFoundExceptionNoSuchMethodException、またはリソース欠落エラーを解決する
  • reflect-config.jsonresource-config.json、またはその他の GraalVM メタデータファイルを生成または編集する
  • GraalVM トレーシングエージェントを使用して到達可能性メタデータを収集する
  • Spring Boot ネイティブサポート用に RuntimeHints を実装する
  • Quarkus または Micronaut でネイティブイメージを構築する

説明

1. コンテキスト別プロジェクト分析

設定を行う前に、プロジェクトを分析してビルドツール、フレームワーク、依存関係を決定します:

ビルドツールを検出する:

# Maven の確認
if [ -f "pom.xml" ]; then
    echo "Build tool: Maven"
    # Maven ラッパーの確認
    [ -f "mvnw" ] && echo "Maven wrapper available"
fi

# Gradle の確認
if [ -f "build.gradle" ] || [ -f "build.gradle.kts" ]; then
    echo "Build tool: Gradle"
    [ -f "build.gradle.kts" ] && echo "Kotlin DSL"
    [ -f "gradlew" ] && echo "Gradle wrapper available"
fi

依存関係を分析してフレームワークを検出する:

  • Spring Boot: pom.xml または build.gradlespring-boot-starter-* を確認
  • Quarkus: quarkus-* 依存関係を確認
  • Micronaut: micronaut-* 依存関係を確認
  • Plain Java: フレームワーク依存関係が検出されない

Java バージョンを確認する:

java -version 2>&1
# GraalVM Native Image には Java 17+ が必要(推奨:Java 21+)

潜在的なネイティブイメージの課題を特定する:

  • リフレクションが多い ライブラリ(Jackson、Hibernate、JAXB)
  • 動的プロキシの使用(JDK プロキシ、CGLIB)
  • リソースバンドルとクラスパスリソース
  • JNI またはネイティブライブラリ依存関係
  • シリアライゼーション要件

2. ビルドツール設定

検出された環境に基づいて適切なビルドツールプラグインを設定します。

Maven プロジェクトの場合、標準ビルドをクリーンに保つために専用の native プロファイルを追加します。完全な設定については Maven Native Profile Reference を参照してください。

Maven の主なセットアップ:

<profiles>
  <profile>
    <id>native</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.graalvm.buildtools</groupId>
          <artifactId>native-maven-plugin</artifactId>
          <version>0.10.6</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>
            <buildArgs>
              <buildArg>--no-fallback</buildArg>
            </buildArgs>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

ビルド実行:./mvnw -Pnative package

Gradle プロジェクトの場合org.graalvm.buildtools.native プラグインを適用します。完全な設定については Gradle Native Plugin Reference を参照してください。

Gradle の主なセットアップ(Kotlin DSL):

plugins {
    id("org.graalvm.buildtools.native") version "0.10.6"
}

graalvmNative {
    binaries {
        named("main") {
            imageName.set(project.name)
            buildArgs.add("--no-fallback")
        }
    }
}

ビルド実行:./gradlew nativeCompile

3. フレームワーク固有の設定

各フレームワークには独自の AOT 戦略があります。検出されたフレームワークに基づいて正しい設定を適用してください。

Spring Boot(3.x+): Spring Boot には GraalVM の組み込みサポートと AOT 処理があります。RuntimeHints@RegisterReflectionForBinding、テストサポートなどのパターンについては Spring Boot Native Reference を参照してください。

主なポイント:

  • spring-boot-starter-parent 3.x+ を使用します(これはネイティブプロファイルを含みます)
  • RuntimeHintsRegistrar を介してリフレクションヒントを登録します
  • process-aot ゴールで AOT 処理を実行します
  • ビルド実行:./mvnw -Pnative native:compile または ./gradlew nativeCompile

Quarkus と Micronaut: これらのフレームワークはネイティブファーストで設計されており、追加設定はほとんど必要ありません。詳細については Quarkus & Micronaut Reference を参照してください。

4. GraalVM 到達可能性メタデータ

Native Image は閉じた世界と仮定します — すべてのコードパスはビルド時に既知である必要があります。リフレクション、リソース、プロキシなどの動的機能には明示的なメタデータ設定が必要です。

メタデータファイルMETA-INF/native-image/<group.id>/<artifact.id>/ に配置されます:

ファイル目的
reachability-metadata.json統合メタデータ(リフレクション、リソース、JNI、プロキシ、バンドル、シリアライゼーション)
reflect-config.jsonレガシー:リフレクション登録
resource-config.jsonレガシー:リソースインクルージョンパターン
proxy-config.jsonレガシー:動的プロキシインターフェース
serialization-config.jsonレガシー:シリアライゼーション登録
jni-config.jsonレガシー:JNI アクセス登録

完全なフォーマットと例については Reflection & Resource Config Reference を参照してください。

5. 反復的な修正エンジン

ネイティブイメージビルドは、メタデータが不足しているために失敗することがよくあります。このような反復的なアプローチに従ってください:

ステップ 1 — ネイティブビルドを実行する:

# Maven
./mvnw -Pnative package 2>&1 | tee native-build.log

# Gradle
./gradlew nativeCompile 2>&1 | tee native-build.log

ステップ 2 — ビルドエラーを解析して根本原因を特定する:

一般的なエラーパターンと修正方法:

エラーパターン原因修正
ClassNotFoundException: com.example.MyClassリフレクションメタデータが不足reflect-config.json に追加するか @RegisterReflectionForBinding を使用
NoSuchMethodExceptionメソッドがリフレクション用に登録されていないリフレクション設定にメソッドを追加
MissingResourceExceptionリソースがネイティブイメージに含まれていないresource-config.json に追加
Proxy class not found動的プロキシが登録されていないインターフェースリストを proxy-config.json に追加
UnsupportedFeatureException: Serializationシリアライゼーションメタデータが不足serialization-config.json に追加

ステップ 3 — 適切なメタデータファイルを更新するか、フレームワークアノテーションを使用して修正を適用する。

ステップ 4 — リビルドして検証する。 ビルドが成功するまで繰り返します。

ステップ 5 — 手動修正が不十分な場合、GraalVM トレーシングエージェントを使用して到達可能性メタデータを自動的に収集します。Tracing Agent Reference を参照してください。

6. 検証とベンチマーク

ネイティブビルドが成功したら:

実行可能ファイルが正しく実行されることを確認する:

# ネイティブ実行可能ファイルを実行
./target/<app-name>

# Spring Boot の場合、アプリケーションコンテキストが読み込まれることを確認
curl http://localhost:8080/actuator/health

起動時間を測定する:

# 起動時間を測定
time ./target/<app-name>

# Spring Boot の場合、スタートアップログを確認
./target/<app-name> 2>&1 | grep "Started .* in"

メモリフットプリント(RSS)を測定する:

# Linux の場合
ps -o rss,vsz,comm -p $(pgrep <app-name>)

# macOS の場合
ps -o rss,vsz,comm -p $(pgrep <app-name>)

JVM ベースラインと比較する:

メトリックJVMネイティブ改善
起動時間~2-5秒~50-200ms10-100倍
メモリ(RSS)~200-500MB~30-80MB3-10倍
バイナリサイズJRE + JARs単一バイナリ簡素化

7. Docker 統合

ネイティブ実行可能ファイルで最小限のコンテナイメージを構築する:

# マルチステージビルド
FROM ghcr.io/graalvm/native-image-community:21 AS builder
WORKDIR /app
COPY . .
RUN ./mvnw -Pnative package -DskipTests

# 最小ランタイムイメージ
FROM debian:bookworm-slim
COPY --from=builder /app/target/<app-name> /app/<app-name>
EXPOSE 8080
ENTRYPOINT ["/app/<app-name>"]

Spring Boot アプリケーションの場合、Cloud Native Buildpacks で paketobuildpacks/builder-jammy-tiny を使用してください:

./mvnw -Pnative spring-boot:build-image

ベストプラクティス

  1. 複雑なプロジェクトではトレーシングエージェントから開始する — 初期メタデータベースラインを生成
  2. native プロファイルを使用する — ネイティブ固有の設定を標準ビルドから分離
  3. --no-fallback を優先する — 真のネイティブビルド(JVM フォールバックなし)を確保
  4. nativeTest でテストする — ネイティブモードで JUnit テストを実行
  5. GraalVM Reachability Metadata Repository を使用する — サードパーティライブラリメタデータ用
  6. リフレクションを最小化する — 可能な限りコンストラクタインジェクションとコンパイル時 DI を優先
  7. リソースパターンを明示的に含める — クラスパススキャンに依存しない
  8. 修正前後をプロファイルする — 常に起動とメモリの改善を測定
  9. Java 21+ を使用する — 最高の GraalVM 互換性とパフォーマンスのため
  10. GraalVM と Native Build Tools のバージョンを揃える

例 1: Spring Boot Maven プロジェクトへのネイティブサポートの追加

シナリオ: Spring Boot 3.x REST API があり、これをネイティブ実行可能ファイルにコンパイルしたいです。

ステップ 1 — pom.xml にネイティブプロファイルを追加する:

<profiles>
  <profile>
    <id>native</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <executions>
            <execution>
              <id>process-aot</id>
              <goals>
                <goal>process-aot</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.graalvm.buildtools</groupId>
          <artifactId>native-maven-plugin</artifactId>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

ステップ 2 — DTO のリフレクションヒントを登録する:

@RestController
@RegisterReflectionForBinding({UserDto.class, OrderDto.class})
public class UserController {

    @GetMapping("/users/{id}")
    public UserDto getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
}

ステップ 3 — ビルドして実行する:

./mvnw -Pnative native:compile
./target/myapp
# Started MyApplication in 0.089 seconds

例 2: ネイティブビルドでのリフレクションエラーの解決

シナリオ: ネイティブビルドが Jackson でシリアライズされた DTO に対して ClassNotFoundException で失敗します。

エラー出力:

com.oracle.svm.core.jdk.UnsupportedFeatureError:
  Reflection registration missing for class com.example.dto.PaymentResponse

修正 — src/main/resources/META-INF/native-image/reachability-metadata.json に追加する:

{
  "reflection": [
    {
      "type": "com.example.dto.PaymentResponse",
      "allDeclaredConstructors": true,
      "allDeclaredMethods": true,
      "allDeclaredFields": true
    }
  ]
}

または Spring Boot アノテーションアプローチを使用する:

@RegisterReflectionForBinding(PaymentResponse.class)
@Service
public class PaymentService { /* ... */ }

例 3: 複雑なプロジェクトでのトレーシングエージェントの使用

シナリオ: 多くのサードパーティライブラリを持つプロジェクトは包括的な到達可能性メタデータが必要です。

# 1. JAR をビルド
./mvnw package -DskipTests

# 2. トレーシングエージェント付きで実行
java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image \
    -jar target/myapp.jar

# 3. すべてのエンドポイントを操作
curl http://localhost:8080/api/users
curl -X POST http://localhost:8080/api/orders -H 'Content-Type: application/json' -d '{"item":"test"}'
curl http://localhost:8080/actuator/health

# 4. アプリケーションを停止(Ctrl+C)してからネイティブをビルド
./mvnw -Pnative native:compile

# 5. 検証
./target/myapp

制約と警告

重要な制約

  • GraalVM Native Image には Java 17+ が必要です(Java 21+ が最高の互換性のために推奨)
  • 閉じた世界と仮定: すべてのコードパスはビルド時に既知である必要があります — 動的クラスローディング、ランタイムバイトコード生成、MethodHandles.Lookup は動作しないことがあります
  • ビルド時間とメモリ: ネイティブコンパイルはリソース集約的です — 典型的なプロジェクトで 2~10 分と 4~8 GB の RAM を予想してください
  • すべてのライブラリが互換性があるわけではありません: リフレクション、動的プロキシ、CGLIB に大きく依存するライブラリは、大量のメタデータ設定が必要な場合があります
  • AOT プロファイルはビルド時に固定されます: Spring Boot @Profile@ConditionalOnProperty は AOT 処理中に評価され、ランタイムではありません

一般的な落とし穴

  • --no-fallback を忘れる: このフラグなしでは、ビルドが JVM フォールバックイメージを静かに作成する可能性があります
  • 不完全なトレーシングエージェントカバレッジ: エージェントは実行中に操作されたコードパスのみをキャプチャします — すべての機能がテストされていることを確認してください
  • バージョン不一致: GraalVM JDK、Native Build Tools プラグイン、フレームワークバージョンを揃えて、非互換性を回避してください
  • クラスパスの違い: AOT/ビルド時のクラスパスはランタイムと一致する必要があります — ネイティブコンパイル後に JAR を追加/削除するとエラーが発生します

セキュリティに関する考慮事項

  • ネイティブ実行可能ファイルは JAR より逆コンパイルが難しいですが、改ざんに強いわけではありません
  • ビルド時にシークレットがネイティブイメージに埋め込まれていないことを確認してください
  • 機密データには環境変数または外部設定を使用してください

トラブルシューティング

問題解決方法
ビルドがメモリ不足になるビルドメモリを増やす:buildArgs-J-Xmx8g
ビルドに時間がかかるビルドキャッシュを使用し、クラスパスを削減し、開発用の高速ビルドモードを有効化
アプリケーションがランタイムでクラッシュリフレクション/リソースメタデータが不足 — トレーシングエージェントを実行
Spring Boot コンテキストの読み込みが失敗@Conditional ビーンとプロファイル依存設定を確認
サードパーティライブラリに互換性がないGraalVM Reachability Metadata リポジトリを確認するか、手動ヒントを追加

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
giuseppe-trisciuoglio
リポジトリ
giuseppe-trisciuoglio/developer-kit
ライセンス
MIT
最終更新
不明

Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT

関連スキル

汎用その他⭐ リポ 1,982

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

by LeoYeAI
汎用その他⭐ リポ 100

civ-finish-quotes

実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。

by huxiuhan
汎用その他⭐ リポ 1,110

nookplot

Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。

by BankrBot
汎用その他⭐ リポ 59

web3-polymarket

Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。

by elophanto
汎用その他⭐ リポ 52

ethskills

Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。

by jiayaoqijia
汎用その他⭐ リポ 44

xxyy-trade

このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。

by Jimmy-Holiday
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: giuseppe-trisciuoglio · giuseppe-trisciuoglio/developer-kit · ライセンス: MIT