このページでは、Fess のビルド方法、テスト方法、 配布パッケージの作成方法について説明します。
ビルドシステムの概要
Fess は Maven をビルドツールとして使用しています。 Maven は、依存関係の管理、コンパイル、テスト、パッケージングを自動化します。
pom.xml
Maven の設定ファイルです。プロジェクトのルートディレクトリに配置されています。
主な設定内容:
プロジェクト情報(groupId、artifactId、version)
依存ライブラリ
ビルドプラグイン
プロファイル
基本的なビルドコマンド
クリーンビルド
ビルド成果物を削除してから、再ビルドします:
mvn clean compile
パッケージの作成
実行可能な JAR ファイルを作成します:
mvn package
成果物は target/ ディレクトリに生成されます:
target/
├── fess-15.3.x.jar
└── fess-15.3.x/
フルビルド
クリーン、コンパイル、テスト、パッケージをすべて実行します:
mvn clean package
依存関係のダウンロード
依存ライブラリをダウンロードします:
mvn dependency:resolve
OpenSearch プラグインのダウンロード
OpenSearch と必須プラグインをダウンロードします:
mvn antrun:run
注釈
このコマンドは、開発環境のセットアップ時や プラグインを更新する際に実行します。
テスト
Fess では、JUnit を使用してテストを実装しています。
単体テストの実行
すべての単体テストを実行
mvn test
特定のテストクラスを実行
mvn test -Dtest=SearchServiceTest
特定のテストメソッドを実行
mvn test -Dtest=SearchServiceTest#testSearch
複数のテストクラスを実行
mvn test -Dtest=SearchServiceTest,CrawlerTest
テストのスキップ
テストをスキップしてビルドする場合:
mvn package -DskipTests
警告
開発中はテストをスキップせず、必ず実行してください。 PR を作成する前には、すべてのテストが通ることを確認してください。
統合テストの実行
統合テストを含むすべてのテストを実行します:
mvn verify
テストの書き方
単体テストの作成
テストクラスの配置
テストクラスは src/test/java/ 以下に配置します。 パッケージ構造は本体コードと同じにします。
src/
├── main/java/org/codelibs/fess/app/service/SearchService.java
└── test/java/org/codelibs/fess/app/service/SearchServiceTest.java
テストクラスの基本構造
package org.codelibs.fess.app.service;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class SearchServiceTest {
@Test
public void testSearch() {
// Given: テストの前提条件
SearchService service = new SearchService();
String query = "test";
// When: テスト対象の実行
SearchResponse response = service.search(query);
// Then: 結果の検証
assertNotNull(response);
assertTrue(response.getResultCount() > 0);
}
}
テストのライフサイクル
import org.junit.jupiter.api.*;
public class MyServiceTest {
@BeforeAll
static void setUpClass() {
// すべてのテストの前に 1 回実行
}
@BeforeEach
void setUp() {
// 各テストの前に実行
}
@Test
void testSomething() {
// テスト
}
@AfterEach
void tearDown() {
// 各テストの後に実行
}
@AfterAll
static void tearDownClass() {
// すべてのテストの後に 1 回実行
}
}
アサーション
JUnit 5 のアサーションを使用します:
import static org.junit.jupiter.api.Assertions.*;
// 等価性
assertEquals(expected, actual);
assertNotEquals(unexpected, actual);
// null チェック
assertNull(obj);
assertNotNull(obj);
// 真偽値
assertTrue(condition);
assertFalse(condition);
// 例外
assertThrows(IllegalArgumentException.class, () -> {
service.doSomething();
});
// コレクション
assertIterableEquals(expectedList, actualList);
モックの使用
Mockito を使用してモックを作成します:
import static org.mockito.Mockito.*;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MockitoExtension.class)
public class SearchServiceTest {
@Mock
private SearchEngineClient searchEngineClient;
@Test
public void testSearch() {
// モックの設定
when(searchEngineClient.search(anyString()))
.thenReturn(new SearchResponse());
// テスト実行
SearchService service = new SearchService();
service.setSearchEngineClient(searchEngineClient);
SearchResponse response = service.search("test");
// 検証
assertNotNull(response);
verify(searchEngineClient, times(1)).search("test");
}
}
テストカバレッジ
JaCoCo でテストカバレッジを測定します:
mvn clean test jacoco:report
レポートは target/site/jacoco/index.html に生成されます。
コード品質チェック
Checkstyle
コーディングスタイルをチェックします:
mvn checkstyle:check
設定ファイルは checkstyle.xml にあります。
SpotBugs
潜在的なバグを検出します:
mvn spotbugs:check
PMD
コード品質の問題を検出します:
mvn pmd:check
すべてのチェックを実行
mvn clean verify checkstyle:check spotbugs:check pmd:check
配布パッケージの作成
リリースパッケージの作成
配布用のパッケージを作成します:
mvn clean package
生成される成果物:
target/releases/
├── fess-15.3.x.tar.gz # Linux/macOS 用
├── fess-15.3.x.zip # Windows 用
├── fess-15.3.x.rpm # RPM パッケージ
└── fess-15.3.x.deb # DEB パッケージ
Docker イメージの作成
Docker イメージを作成します:
mvn package docker:build
生成されるイメージ:
docker images | grep fess
プロファイル
Maven プロファイルを使用して、環境ごとに異なる設定を適用できます。
開発プロファイル
開発用の設定でビルドします:
mvn package -Pdev
本番プロファイル
本番用の設定でビルドします:
mvn package -Pprod
高速ビルド
テストとチェックをスキップして高速にビルドします:
mvn package -Pfast
警告
高速ビルドは開発中の確認用です。 PR を作成する前には、必ずフルビルドを実行してください。
CI/CD
Fess では、GitHub Actions を使用して CI/CD を実行しています。
GitHub Actions
.github/workflows/ ディレクトリに設定ファイルがあります。
自動実行されるチェック:
ビルド
単体テスト
統合テスト
コードスタイルチェック
コード品質チェック
ローカルでの CI チェック
PR を作成する前に、ローカルで CI と同様のチェックを実行できます:
mvn clean verify checkstyle:check
トラブルシューティング
ビルドエラー
エラー: 依存関係のダウンロード失敗
# Maven のローカルリポジトリをクリア
rm -rf ~/.m2/repository
mvn clean compile
エラー: メモリ不足
# Maven のメモリを増やす
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512m"
mvn clean package
エラー: Java バージョンが古い
Java 21 以降を使用してください:
java -version
テストエラー
テストがタイムアウトする
テストのタイムアウト時間を延長:
mvn test -Dmaven.test.timeout=600
OpenSearch が起動しない
ポートを確認し、使用中の場合は変更します:
lsof -i :9201
依存関係の問題
依存関係の競合
依存関係ツリーを確認:
mvn dependency:tree
特定の依存関係を除外:
<dependency>
<groupId>org.example</groupId>
<artifactId>example-lib</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>conflicting-lib</groupId>
<artifactId>conflicting-lib</artifactId>
</exclusion>
</exclusions>
</dependency>
ビルドのベストプラクティス
定期的なクリーンビルド
定期的にクリーンビルドを実行して、ビルドキャッシュの問題を回避します:
mvn clean package
テストの実行
コミット前に必ずテストを実行します:
mvn test
コード品質のチェック
PR を作成する前にコード品質をチェックします:
mvn checkstyle:check spotbugs:check
依存関係の更新
定期的に依存関係を更新します:
mvn versions:display-dependency-updates
ビルドキャッシュの活用
ビルド時間を短縮するため、Maven のキャッシュを活用します:
# 既にコンパイル済みの場合はスキップ
mvn compile
Maven コマンドリファレンス
よく使うコマンド
# クリーン
mvn clean
# コンパイル
mvn compile
# テスト
mvn test
# パッケージ
mvn package
# インストール(ローカルリポジトリに登録)
mvn install
# 検証(統合テストを含む)
mvn verify
# 依存関係の解決
mvn dependency:resolve
# 依存関係ツリーの表示
mvn dependency:tree
# プロジェクト情報の表示
mvn help:effective-pom
次のステップ
ビルドとテストの方法を理解したら、以下のドキュメントを参照してください:
開発ワークフロー - 開発ワークフロー
コントリビューションガイド - コントリビューションガイドライン
アーキテクチャとコード構造 - コードベースの理解