# バッチ設計書 18-cli-prod-jar

## 概要

本ドキュメントは、clojure-lspプロジェクトにおける本番用スタンドアロンJARファイル生成バッチ（cli-prod-jar）の設計仕様を記載したものです。

### 本バッチの処理概要

本バッチは、本番用のスタンドアロンJARファイル（clojure-lsp-standalone.jar）を生成します。このJARはGraalVM用の最適化が施されており、ネイティブイメージのビルドに使用されます。デバッグ用ライブラリは含まれません。

**業務上の目的・背景**：clojure-lspの本番配布用JARを生成するためのバッチです。デバッグ用ライブラリ（cider-nrepl、clj-async-profiler等）を含まず、GraalVM native-image用に最適化されたJARを生成します。このJARはnative-cliバッチの入力として使用され、高速起動が可能なネイティブ実行ファイルの元となります。また、JARとして直接実行することも可能です。

**バッチの実行タイミング**：リリースビルド時、またはネイティブイメージのビルド前に実行されます。CIパイプラインでも使用されます。

**主要な処理内容**：
1. cliモジュールのtargetディレクトリをクリーン
2. :nativeエイリアスを含むbasisでUberJARを作成
3. Clojureソースコードのコンパイル（AOTコンパイル）
4. UberJARファイルの作成（cli/target/clojure-lsp-standalone.jar）
5. 生成したJARファイルをプロジェクトルートへ移動

**前後の処理との関連**：本バッチは単独で実行可能です。native-cliバッチの前提処理として使用されます。prod-cliバッチでも同じJAR生成処理が行われます。

**影響範囲**：cli/targetディレクトリ配下が再作成され、プロジェクトルートにclojure-lsp-standalone.jarが出力されます。既存のJARファイルは上書きされます。

## バッチ種別

ビルドタスク（本番用UberJAR生成）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（リリース時） |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | 手動 / CI |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Babashka | Babashkaがインストールされていること |
| Clojure CLI | Clojure CLIツールがインストールされていること |
| cli/deps.edn | cliディレクトリにdeps.ednが存在すること |
| lib/deps.edn | libディレクトリにdeps.ednが存在すること |
| CLOJURE_LSP_VERSION | lib/resources/CLOJURE_LSP_VERSIONファイルが存在すること |
| 十分なメモリ | AOTコンパイルとUberJAR作成に2GB以上のヒープメモリ |

### 実行可否判定

特別な実行可否判定はありません。前提条件を満たしていれば実行可能です。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 本バッチはパラメータを受け取りません |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| cli/deps.edn | EDN | cliモジュールの依存関係定義ファイル |
| lib/deps.edn | EDN | libモジュールの依存関係定義ファイル（:extraで参照） |
| cli/src/ | Clojureソース | cliモジュールのソースコード |
| cli/resources/ | リソース | cliモジュールのリソースファイル |
| lib/src/ | Clojureソース | libモジュールのソースコード |
| lib/resources/ | リソース | libモジュールのリソースファイル |
| lib/resources/CLOJURE_LSP_VERSION | テキスト | バージョン情報ファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| clojure-lsp-standalone.jar | UberJAR | 本番用スタンドアロンJARファイル |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | clojure-lsp-standalone.jar |
| 出力先 | プロジェクトルート（./) |
| 文字コード | N/A（バイナリ） |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. バッチ起動（bb cli-prod-jar）
   └─ make/cli-prod-jar関数の呼び出し

2. ビルドタスク実行
   └─ cliディレクトリでclojure -T:build prod-jarを実行

3. standalone-aot-jar処理（内部呼び出し）
   └─ targetディレクトリ削除
   └─ :nativeエイリアス有効化

4. ソースコピー
   └─ src, resourcesをtarget/classesへコピー

5. AOTコンパイル
   └─ b/compile-cljでClojureソースをコンパイル
   └─ JVMオプション: -Xmx2g -server

6. UberJAR作成
   └─ b/uberによるUberJAR作成
   └─ メインクラス: clojure-lsp.main
   └─ 出力: cli/target/clojure-lsp-standalone.jar

7. ファイル移動
   └─ cli/target/clojure-lsp-standalone.jarをプロジェクトルートへ移動
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[cliディレクトリへ移動]
    B --> C[clojure -T:build prod-jar 実行]
    C --> D[targetディレクトリ削除]
    D --> E[":native エイリアス有効化"]
    E --> F[src, resourcesをtarget/classesへコピー]
    F --> G[AOTコンパイル -Xmx2g -server]
    G --> H[b/uber実行 UberJAR作成]
    H --> I[clojure-lsp-standalone.jarをルートへ移動]
    I --> J[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | - | - | 本バッチはデータベースを使用しません |

### テーブル別操作詳細

本バッチはデータベースを使用しません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | FileNotFound | deps.ednが存在しない | cliディレクトリにdeps.ednを配置 |
| - | FileNotFound | ソースファイルが存在しない | cli/src, lib/srcにソースコードを配置 |
| - | CompilationError | Clojureソースのコンパイルエラー | ソースコードのエラーを修正 |
| - | ProcessError | Clojure CLIが見つからない | Clojure CLIをインストール |
| - | OutOfMemoryError | ヒープメモリ不足 | ヒープサイズを増加（-Xmx2g以上） |
| - | IOException | ディスク容量不足 | ディスク容量を確保 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動再実行） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

エラー発生時は標準エラー出力にエラーメッセージが表示されます。コンパイルエラーの場合は、エラーメッセージに従ってソースコードを修正してください。OutOfMemoryErrorの場合は、JAVA_OPTS環境変数でヒープサイズを増加させてください。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイル操作のみ） |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行で1 UberJARファイル生成 |
| 目標処理時間 | 90秒以内 |
| メモリ使用量上限 | AOTコンパイルのため2GB以上必要（-Xmx2g設定） |

## 排他制御

同時実行は想定されていません。同じディレクトリで複数のビルドプロセスが同時に実行される場合、ファイル競合が発生する可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ビルド開始時 | "Building uberjar..." |
| 進捗ログ | 処理中 | Clojure CLIの標準出力 |
| エラーログ | エラー発生時 | 例外スタックトレース、コンパイルエラー |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | - | - |

本バッチはローカル開発またはCI環境で実行されるため、専用の監視・アラート設定はありません。

## 備考

- :nativeエイリアスには以下のJVMオプションが含まれます
  - -Xmx2g -server
  - -Dborkdude.dynaload.aot=true
  - -Dclojure.compiler.direct-linking=true
  - -Dclojure.spec.skip-macros=true
- graal-build-time（バージョン1.0.5）が依存に含まれます
- devディレクトリは含まれません（デバッグ用ライブラリなし）
- AOTコンパイルにより、起動時間が短縮されます
- メインクラスはclojure-lsp.mainに設定されます
- バージョン情報はlib/resources/CLOJURE_LSP_VERSIONファイルから読み込まれます
- 生成後、JARファイルはmv-here関数によりプロジェクトルートへ移動されます
- cli-debug-jarとの違いは、:nativeエイリアス使用（:debugなし）とdevディレクトリ非包含
