# バッチ設計書 13-lib-jar

## 概要

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

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

本バッチは、libモジュールのJARファイル（clojure-lsp.jar）を生成します。libモジュールはclojure-lspのコアライブラリであり、Language Server Protocolの主要な機能を提供します。

**業務上の目的・背景**：clojure-lspはClojureエコシステムにおけるLanguage Server Protocol実装であり、コアライブラリ（lib）を独立したJARとして配布することで、他のプロジェクトからライブラリとして利用可能にします。このバッチにより、libモジュールのソースコードとリソースをパッケージングし、Mavenリポジトリ（Clojars）へのデプロイやローカルでの利用を可能にします。

**バッチの実行タイミング**：リリース準備時、または開発者がlibモジュールをパッケージングする必要がある際に手動で実行されます。deploy-clojarsバッチの前提処理として実行されることもあります。

**主要な処理内容**：
1. libモジュールのtargetディレクトリをクリーン
2. pom.xmlの生成
3. ソースコードとリソースをtarget/classesにコピー
4. JARファイルの作成（lib/target/clojure-lsp.jar）
5. 生成したJARファイルをプロジェクトルートへ移動

**前後の処理との関連**：本バッチは単独で実行可能ですが、deploy-clojarsバッチの内部処理としても使用されます。生成されたJARはClojarsへのデプロイに使用されます。

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

## バッチ種別

ビルドタスク（JAR生成）

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Babashka | Babashkaがインストールされていること |
| Clojure CLI | Clojure CLIツールがインストールされていること |
| deps.edn | libディレクトリにdeps.ednが存在すること |
| pom.xml | libディレクトリにテンプレートとなるpom.xmlが存在すること |
| CLOJURE_LSP_VERSION | lib/resources/CLOJURE_LSP_VERSIONファイルが存在すること |

### 実行可否判定

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

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| lib/deps.edn | EDN | libモジュールの依存関係定義ファイル |
| lib/pom.xml | XML | テンプレートPOMファイル |
| lib/src/ | Clojureソース | libモジュールのソースコード |
| lib/resources/ | リソース | libモジュールのリソースファイル |
| lib/resources/CLOJURE_LSP_VERSION | テキスト | バージョン情報ファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| clojure-lsp.jar | JAR | 生成されたlibモジュールのJARファイル |
| lib/pom.xml | XML | 生成されたMaven POMファイル |
| lib/pom.properties | Properties | Maven用プロパティファイル |

### 出力ファイル仕様

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

## 処理フロー

### 処理シーケンス

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

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

3. クリーン処理
   └─ lib/targetディレクトリの削除

4. POM生成
   └─ b/write-pomによるpom.xml生成
   └─ ファイルコピー

5. ソースコピー
   └─ lib/srcをtarget/classesへコピー
   └─ lib/resourcesをtarget/classesへコピー

6. JAR作成
   └─ b/jarによるJARファイル生成
   └─ 出力: lib/target/clojure-lsp.jar

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

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[libディレクトリへ移動]
    B --> C[clojure -T:build jar 実行]
    C --> D[targetディレクトリ削除]
    D --> E[pom.xml生成]
    E --> F[src/, resources/ をtarget/classesへコピー]
    F --> G[JAR作成]
    G --> H[clojure-lsp.jarをルートへ移動]
    H --> I[バッチ終了]
```

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

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

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | FileNotFound | deps.ednが存在しない | libディレクトリにdeps.ednを配置 |
| - | FileNotFound | ソースファイルが存在しない | lib/srcにソースコードを配置 |
| - | ProcessError | Clojure CLIが見つからない | Clojure CLIをインストール |
| - | IOException | ディスク容量不足 | ディスク容量を確保 |

### リトライ仕様

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

### 障害時対応

エラー発生時は標準エラー出力にエラーメッセージが表示されます。前提条件を確認し、必要なファイルやツールが存在することを確認してから再実行してください。lib/targetディレクトリが不完全な状態の場合は、bb cleanを実行してから再試行してください。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行で1 JARファイル + 2メタファイル生成 |
| 目標処理時間 | 10秒以内 |
| メモリ使用量上限 | JVMデフォルト設定に依存 |

## 排他制御

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

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 処理中 | Clojure CLIの標準出力 |
| エラーログ | エラー発生時 | 例外スタックトレース |

## 監視・アラート

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

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

## 備考

- 生成されるJARはcom.github.clojure-lsp/clojure-lspというMaven座標を持ちます
- JARにはコンパイル済みクラスファイルは含まれず、ソースコードがそのまま含まれます
- 依存ライブラリは含まれません（uberjarではありません）
- バージョン情報はlib/resources/CLOJURE_LSP_VERSIONファイルから読み込まれます
- 生成後、JARファイルはプロジェクトルートへ移動されます（mv-here関数による）
