概要
Fess のプラグインシステムにより、コア機能を拡張できます。 プラグインは JAR ファイルとして配布され、クラスパスに追加されると DI コンテナ(Lasta Di)によってコンポーネントが読み込まれ、対応する ファクトリーやマネージャーへ登録されます。
プラグインの種類
Fess は、アーティファクト名のプレフィックスによってプラグインの種類を 判別します(PluginHelper.ArtifactType)。主な種類は以下のとおりです:
| 種類 | プレフィックス | 説明 |
|---|---|---|
| データストア | fess-ds-* | 新しいデータソースからのコンテンツ取得(Box、Slack、Git 等) |
| Webアプリ | fess-webapp-* | Web インターフェースや検索機能の拡張 |
| スクリプトエンジン | fess-script-* | 新しいスクリプト言語のサポート |
| Ingest | fess-ingest-* | インデックス登録時のドキュメント加工 |
| テーマ | fess-theme-* | 検索画面デザインのカスタマイズ |
| サムネイル | fess-thumbnail-* | サムネイル生成方式の追加 |
| LLM | fess-llm-* | RAG/チャットで使用する LLM プロバイダーの追加 |
| クローラー | fess-crawler-* | クローラークライアントの拡張 |
プラグイン構造
基本構造
データストアプラグインの実装テンプレートである fess-ds-example を例にすると、 プラグインは「実装クラス」と「DI 登録ファイル」で構成されます:
pom.xmlの例
プラグインは fess-parent を親 POM とする jar としてビルドします。 fess や opensearch など、実行時に Fess 本体から提供されるライブラリは provided スコープで宣言します。バージョン番号やビルド設定(フォーマッター・ ライセンスヘッダーなど)は親 POM から継承されます。
注釈
開発中のブランチでは、バージョンは 15.8.0-SNAPSHOT のように -SNAPSHOT 付きに なります。プラグイン固有の依存ライブラリは通常の Maven 依存関係として宣言します。 これらは Fess 本体には含まれないため、プラグインと一緒に配布する必要があります。
プラグインの登録
DIコンテナへの登録
プラグインは、fess_ds++.xml のように末尾が ++ の DI 設定ファイルで コンポーネントを登録します。Lasta Di は、クラスパス上に見つかった ++ 付きの ファイルを、Fess 本体の対応する設定ファイル(この例では fess_ds.xml)へ 自動的にマージします。この仕組みにより、プラグインは Fess 本体のファイルを 編集することなく、自身のコンポーネントを追加できます。
プラグインの種類ごとにマージ先のファイルが異なります。例えばスクリプトエンジンは fess_se++.xml、Ingest は fess_ingest++.xml、LLM プロバイダーは fess_llm++.xml、Web アプリは app++.xml を使用します。
コンポーネントの初期化
<postConstruct name="register"> は、コンポーネント生成後に呼び出す メソッドを指定する Lasta Di のライフサイクル設定です。データストアの場合、 AbstractDataStore が持つ register() メソッドが呼び出され、 自身が DataStoreFactory に登録されます:
注釈
これは Java の @PostConstruct アノテーションではなく、DI 設定ファイルの <postConstruct> 要素による初期化です。登録される名前は getName() の 戻り値であり、管理画面でプラグインを選択する際の名前になります。
プラグインのライフサイクル
初期化
プラグイン JAR がクラスパスに追加される
DI コンテナが
fess_*++.xmlをマージし、コンポーネントを生成する<postConstruct>で指定したメソッド(例:register)が呼び出されるプラグインが対応するファクトリー/マネージャーに登録される
終了
DI コンテナの終了時に、
<preDestroy>で指定したメソッドが呼び出される (定義されている場合)リソースのクリーンアップ
注釈
データストアの場合、実行中のクロールは AbstractDataStore.stop() によって 停止フラグが立てられ、レコード処理ループが安全に終了します。
依存関係
Fess本体との依存
Fess 本体のクラスは実行時にサーバーのクラスパス上に存在するため、 provided スコープで依存します(プラグイン JAR には含めません)。
外部ライブラリ
プラグインは独自の依存ライブラリを含めることができます:
これらは Fess 本体に含まれないため、プラグインと一緒に配布する必要があります。
設定の取得
パラメーターとFessConfigの取得
データストアの storeData() では、管理画面で設定したパラメーターを DataStoreParams から取得します。値の取得には getAsString() を使用します (DataStoreParams は Map を実装していないため get() は文字列を返しません)。 また、Fess の設定値は ComponentUtil.getFessConfig() から取得できます:
storeData() の詳しい実装方法(データ取得・スクリプト評価・インデックス登録の 流れ)は データストアプラグイン開発 を参照してください。
ビルドとインストール
ビルド
target/ ディレクトリに JAR ファイル(例: fess-ds-example-15.8.0.jar)が 生成されます。
インストール
管理画面から:
「システム」→「プラグイン」→「インストール」を開く
プラグインリポジトリの一覧から選択するか、ビルドした JAR ファイルを アップロードしてインストール
手動:
JAR ファイルを
app/WEB-INF/plugin/ディレクトリにコピーFess を再起動
インストール手順の詳細は プラグイン を参照してください。
デバッグ
ログ出力
Fess は Log4j2 を使用します。ロガーは LogManager.getLogger() で取得します:
注釈
パスワードやトークンなどの機微な情報はログに出力しないでください。
開発モード
開発時は Fess を IDE から起動してデバッグできます:
org.codelibs.fess.FessBootクラスをデバッグ実行するプラグインのソースをプロジェクトに含める
ブレークポイントを設定する
公開プラグイン一覧
Fess プロジェクトでは、多数のプラグインが公開されています。以下は代表例です (すべてを網羅したものではありません):
| プラグイン | 説明 |
|---|---|
fess-ds-box | Box コネクター |
fess-ds-dropbox | Dropbox コネクター |
fess-ds-slack | Slack コネクター |
fess-ds-atlassian | JIRA / Confluence コネクター |
fess-ds-git | Git リポジトリコネクター |
fess-llm-openai | OpenAI LLM プロバイダー |
fess-theme-* | カスタムテーマ |
このほかにも、fess-ds-csv / fess-ds-db / fess-ds-json / fess-ds-microsoft365 / fess-ds-sharepoint などのデータストアコネクターや、 fess-llm-ollama / fess-llm-gemini などの LLM プロバイダーが公開されています。 これらのプラグインは、開発の参考として GitHub で公開されています。
参考情報
データストアプラグイン開発 - データストアプラグイン開発
スクリプトエンジンプラグイン - スクリプトエンジンプラグイン
Webアプリプラグイン - Webアプリプラグイン
Ingestプラグイン - Ingestプラグイン
テーマ開発ガイド - テーマのカスタマイズ
プラグイン - プラグインのインストール