[解決済み] Mavenを使用してJARの "META-INF/services "フォルダに設定ファイルをインクルードする方法
質問
私は Maven を使用して構築された Eclipse の Java プロジェクトで作業しています。古いプロジェクトからリサイクルされたコードを使用していますが、これらのクラスの 1 つが
META-INF/services
フォルダーにある特定の名前のファイルを探し、そのファイルのテキストを解析します。この特定の例では、Java インターフェイスの名前を持つファイルを探し、そのファイルの中から実装のクラス名を取得します。
つまり、基本的に私がやろうとしていることは JARの"META-INF/services"フォルダにファイル名(X)と1行のテキスト(Y)を持つファイルをインクルードすることです。 . 私はこれがMavenを使用して、多分POMファイルで属性を指定することによって行われるべきであると推測していますが、私の研究は何も発見していません。私はあなたがハードコードまたは手動でMETAファイルを入力することになっていないことを知っているので、私はここで何をすべきかわかりません。
どのように解決するのですか?
新しいソースフォルダを作成する
を作成し、その場所を
src/main/resources
を作成し、次に
META-INF/services
フォルダを作成し、完全修飾クラス名 (FQCN) ファイルをドロップしてください。これで、自動的にjarファイルにコピーされるはずです。つまり、FQCNが
com.acme.MyInterface
の実装では、こうなります。
Project
| src
| | main
| | java
| | [your source code]
| | resources
| | META-INF
| | services
| | com.acme.MyInterface
なお
com.acme.MyInterface
はファイル名であり、Javaのパッケージのようなディレクトリ構造ではありません。ファイル名は実装するインターフェースのFQCNで、その中に、例えば、各実装のFQCNをそれぞれの行に記述することになります。
com.example.MyInterfaceImpl
com.example.AnotherMyInterfaceImpl
これは、デフォルトのソースセットを持つGradleプロジェクトにも適用されることは注目に値します。
一度これを行うと、インターフェイスのすべての実装をロードすることができます。
ServiceLoader
:
ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
for (MyInterface service : loader) {
// Prints com.example.MyInterfaceImpl and com.example.AnotherMyInterfaceImpl
System.out.println(service.class.getName());
}
いくつか注意することがあります。
- すべての実装は、引数なしのコンストラクタを持たなければなりません。
-
モジュールやカスタムのクラスローダを使うアプリケーションは、 オーバーロードされた
ServiceLoader.load
これらの条件でうまくいかない場合は、他のシステム、例えばSpringやEJBなどのCDIスタイルのフレームワークに切り替えるとよいでしょう。
関連
-
プロジェクトの依存関係を解決できない。
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
eclipse にリソースリーク:'in' が閉じない
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
Java基礎 - マッピングとQ/A
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Mavenプロジェクトにローカルのjarファイルを追加する方法は?
-
[解決済み] IntelliJのインスペクションで「シンボルを解決できない」と表示されたが、コードはコンパイルされる
-
[解決済み] Mavenで最終的なJARファイル内のライブラリフォルダに必要なすべてのJARファイルを配置するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
Javaでよくある構文エラー
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
プロジェクトの依存関係を解決できない。
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
-bash: java: コマンドが見つからない 解決方法
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
SocketException java.netの4つの例外解決策。
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析