# バッチ設計書 16-standalone-install

## 概要

本ドキュメントは、clojure-lspプロジェクトにおけるスタンドアロンJARをローカルMavenリポジトリにインストールするバッチ（standalone-install）の設計仕様を記載したものです。

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

本バッチは、スタンドアロンJARファイル（依存ライブラリを含むuberjar形式）を生成し、ローカルのMavenリポジトリ（~/.m2/repository）にインストールします。これにより、開発中のclojure-lsp-standaloneを他のローカルプロジェクトから依存関係として参照可能になります。

**業務上の目的・背景**：clojure-lsp-standaloneは、すべての依存ライブラリを含む単一のJARファイル（uberjar）として配布される形式です。開発者がclojure-lspの最新の開発版を他のローカルプロジェクトでテストしたい場合、Clojarsにデプロイする前にローカルでインストールする必要があります。本バッチにより、standalone jarをビルドし、ローカルMavenリポジトリにインストールすることで、他のプロジェクトから参照可能になります。

**バッチの実行タイミング**：開発中にローカルで最新版をテストしたい場合に手動で実行されます。特に、完全なスタンドアロン実行が必要なテストケースで使用されます。

**主要な処理内容**：
1. cliモジュールのtargetディレクトリをクリーン
2. pom.xmlの生成（standalone-lib座標を使用）
3. libとcliの両方のソースコードとリソースをtarget/classesにコピー
4. UberJARファイルの作成（cli/target/clojure-lsp-standalone.jar）
5. ローカルMavenリポジトリへのインストール（b/install）

**前後の処理との関連**：本バッチは単独で実行可能です。内部的にstandalone-jar関数を呼び出してuberjarを生成した後、b/installでローカルリポジトリにインストールします。

**影響範囲**：cli/targetディレクトリ配下が再作成され、~/.m2/repository/com/github/clojure-lsp/clojure-lsp-standalone/にアーティファクトがインストールされます。

## バッチ種別

ビルドタスク（UberJAR生成 + ローカルインストール）

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Babashka | Babashkaがインストールされていること |
| Clojure CLI | Clojure CLIツールがインストールされていること |
| cli/deps.edn | cliディレクトリにdeps.ednが存在すること |
| lib/deps.edn | libディレクトリにdeps.ednが存在すること |
| pom.xml | cliディレクトリにテンプレートとなるpom.xmlが存在すること |
| CLOJURE_LSP_VERSION | lib/resources/CLOJURE_LSP_VERSIONファイルが存在すること |
| Maven設定 | ~/.m2ディレクトリへの書き込み権限があること |
| 十分なメモリ | UberJAR作成に十分なヒープメモリ |

### 実行可否判定

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

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| cli/deps.edn | EDN | cliモジュールの依存関係定義ファイル |
| lib/deps.edn | EDN | libモジュールの依存関係定義ファイル（:extraで参照） |
| cli/pom.xml | XML | テンプレートPOMファイル |
| cli/src/ | Clojureソース | cliモジュールのソースコード |
| cli/resources/ | リソース | cliモジュールのリソースファイル |
| lib/src/ | Clojureソース | libモジュールのソースコード |
| lib/resources/ | リソース | libモジュールのリソースファイル |
| lib/resources/CLOJURE_LSP_VERSION | テキスト | バージョン情報ファイル |
| 依存ライブラリ | JAR | Mavenリポジトリからダウンロードされた依存ライブラリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| ~/.m2/repository/com/github/clojure-lsp/clojure-lsp-standalone/{version}/ | Maven形式 | インストールされたアーティファクト |
| cli/target/clojure-lsp-standalone.jar | UberJAR | 生成された中間JARファイル |
| cli/pom.xml | XML | 生成されたMaven POMファイル |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | clojure-lsp-standalone-{version}.jar |
| 出力先 | ~/.m2/repository/com/github/clojure-lsp/clojure-lsp-standalone/{version}/ |
| 文字コード | N/A（バイナリ） |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

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

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

3. standalone-jar処理（内部呼び出し）
   └─ targetディレクトリ削除
   └─ pom.xml生成（standalone-lib座標）
   └─ ソースコピー
   └─ b/uberによるUberJAR作成

4. ローカルインストール
   └─ b/installによるMavenローカルリポジトリへのインストール
   └─ ~/.m2/repository配下にアーティファクトを配置

5. 完了ログ出力
   └─ "Installing to local mvn repo..."
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[cliディレクトリへ移動]
    B --> C[clojure -T:build standalone-install 実行]
    C --> D[standalone-jar関数呼び出し]
    D --> E[targetディレクトリ削除]
    E --> F[pom.xml生成 standalone-lib座標]
    F --> G[ソースコピー]
    G --> H[b/uber実行 UberJAR作成]
    H --> I["Installing to local mvn repo..." 出力]
    I --> J[b/install実行]
    J --> K[~/.m2/repositoryにインストール]
    K --> L[バッチ終了]
```

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

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

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | FileNotFound | deps.ednが存在しない | cliディレクトリにdeps.ednを配置 |
| - | FileNotFound | ソースファイルが存在しない | cli/src, lib/srcにソースコードを配置 |
| - | ProcessError | Clojure CLIが見つからない | Clojure CLIをインストール |
| - | OutOfMemoryError | ヒープメモリ不足 | JVM_OPTSでヒープサイズを増加 |
| - | IOException | ディスク容量不足 | ディスク容量を確保 |
| - | PermissionDenied | ~/.m2への書き込み権限がない | ディレクトリの権限を確認 |

### リトライ仕様

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

### 障害時対応

エラー発生時は標準エラー出力にエラーメッセージが表示されます。OutOfMemoryErrorの場合は、JAVA_OPTSまたはJVM_OPTS環境変数でヒープサイズを増加させてください。~/.m2ディレクトリの権限問題の場合は、ディレクトリの所有者と権限を確認してください。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行で複数ファイルをローカルリポジトリにインストール |
| 目標処理時間 | 60秒以内 |
| メモリ使用量上限 | UberJAR作成のため2GB以上推奨 |

## 排他制御

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

## ログ出力

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

## 監視・アラート

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

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

## 備考

- 生成されるJARはcom.github.clojure-lsp/clojure-lsp-standaloneというMaven座標を持ちます
- インストール先は~/.m2/repository/com/github/clojure-lsp/clojure-lsp-standalone/{version}/
- バージョン情報はlib/resources/CLOJURE_LSP_VERSIONファイルから読み込まれます
- b/uberでUberJARを作成するため、すべての依存ライブラリがJARに含まれます
- メインクラスはclojure-lsp.mainに設定されます
- :debug :testのaliasが追加されたbasisが使用されます
- server-installとの違いは、UberJAR形式で依存ライブラリが含まれる点です
