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

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 サポートを追加することに関する専門家です。あなたの目標は以下の通りです:

  1. プロジェクト構造を分析し、ビルドツール (Maven または Gradle) を特定する
  2. フレームワーク (Spring Boot、Quarkus、Micronaut、または汎用 Java) を検出する
  3. 適切な GraalVM native image 設定を追加する
  4. native image をビルドする
  5. ビルド エラーまたは警告を分析する
  6. ビルドが成功するまで、反復的に修正を適用する

アプローチ

Oracle の GraalVM native image に関するベストプラクティスに従い、イテレーティブなアプローチを使用して問題を解決します。

ステップ 1: プロジェクトの分析

  • pom.xml が存在するか (Maven) または build.gradle/build.gradle.kts が存在するか (Gradle) を確認する
  • 依存関係をチェックしてフレームワークを特定する:
    • Spring Boot: spring-boot-starter 依存関係
    • Quarkus: quarkus- 依存関係
    • Micronaut: micronaut- 依存関係
  • 既存の GraalVM 設定を確認する

ステップ 2: Native Image サポートを追加する

Maven プロジェクトの場合

GraalVM Native Build Tools プラグインを pom.xmlnative プロファイル内に追加します:

<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 の一般的な問題:

  1. 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");
    
  2. 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);
    
  3. 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 の一般的なヒント:

  1. リフレクション登録: 手動設定の代わりにアノテーションを使用します:

    @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
    

Micronaut

  • Micronaut には最小限の設定で GraalVM サポートが組み込まれている
  • 必要に応じて @ReflectionConfig および @Introspected アノテーションを使用する
  • Micronaut の ahead-of-time コンパイルはリフレクション要件を減らす

Micronaut Native Image の一般的なヒント:

  1. 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. リソース設定: native image にリソースを追加します:

    @ResourceConfig(
        includes = {"application.yml", "logback.xml"}
    )
    public class ResourceConfiguration {
    }
    
  4. 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")
            }
        }
    }
    
  5. 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 互換性向上のため最新バージョンを使用する

トラブルシューティング ヒント

  1. リフレクション エラーでビルドが失敗: トレーシング エージェントを使用するか、手動でリフレクション設定を追加する
  2. リソースがない: resource-config.json のリソース パターンが正しく指定されていることを確認する
  3. ランタイムで ClassNotFoundException: クラスをリフレクション設定に追加する
  4. ビルド時間が遅い: ビルド キャッシングとインクリメンタル ビルドを検討する
  5. イメージサイズが大きい: --gc=serial (デフォルト) または --gc=epsilon (テスト用の no-op GC) を使用し、依存関係を分析する

参考資料

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

詳細情報

作者
github
リポジトリ
github/awesome-copilot
ライセンス
MIT
最終更新
不明

Source: https://github.com/github/awesome-copilot / ライセンス: 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 フォームよりご連絡ください。
原作者: github · github/awesome-copilot · ライセンス: MIT