問題タブ [serviceloader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
jboss7.x - JBoss 7 サービスローダー
インターフェースMyInterfraceがあります。
システムにはいくつかの EAR があり、それぞれがそのインターフェイスの独自の実装を持っています。名前のないすべての実装を見つける必要があります ( ? extends MyInterface )。
私はjava.util.ServiceLoaderを使用することに決め、その中に META-INF/services/com.example.MyInterface を含む jar を作成しました。この jar はどの EAR でもデプロイできます。
jar には、int の init メソッド内にサーブレットと次のコードがあります。
しかし、イテレータはまだ空です..
services/com.example.MyInterface を EARs META-INF に追加しようとしましたが、結果は同じです。
このアプローチは、jboss 6 と tomcat でうまく機能します。
weblogic - WebLogic12c での ServiceLoader の問題
Activiti の実装を CDI を使用するようにリファクタリングしようとしましたが、多くの問題に遭遇しました。私はすでにこれを解決するためにあまりにも多くの時間を費やしてきましたが、それを手放すことはできません...私は今、問題を突き止め、Activitiを関与させずにきれいに構造化された戦争を設定し、それができたと思います.私が主な問題だと思うものを再現すること。
基本的に、jar1 と jar2 があり、どちらも META-INF/beans.xml を含めることで CDI が有効になります。両方の jar は、META-INF/services/test.TheTest で、それぞれの jar にローカルな実装を指すクラスを指定します。jar1 は jar2 に依存します。また、両方の jar が javax.enterprise.inject.spi.Extension の実装を指し、シナリオをトリガーします。Extension の各実装には、次のようなメソッドがあります。
さて、私の問題は、ServiceLoader
WebLogic12c を実行しているときに、どちらの場合も実装が表示されないことです。Jboss 7.1.1 と Glassfish の両方で同じコードが完全に正常に動作し、test.TheTest インターフェイスの両方の実装がリストされています。
これが実際に WebLogic 12c の問題であると仮定するのは公平でしょうか、それとも何か間違ったことをしているのですか? Activiti を組み込むときに使用する本番環境のセットアップをエミュレートしようとしているだけであることを心に留めておいてください。
よろしく、/ペッター
java - カスタム テキスト ファイルをビルド プロセスに含める方法
最近、ServiceLoader を使用してロードするプラグインを作成して遊んでいます。ServiceLoader がプラグインを見つけるには、META-INF/services/ の下の jar にテキスト ファイルが含まれている必要があります。テキスト ファイルには、ServiceLoader が「探している」インターフェイスの名前を付ける必要があり、実装するクラスの正規名を含める必要があります。これはすべて問題なく動作していますが、このアプローチには本当に厄介な問題が 1 つあります。プロジェクトをビルドするたびに、手動で/services/ フォルダーとテキスト ファイルを jar に追加する必要があります (Winrar を使用)。これは、開発中は非常に面倒です。テストするためにプロジェクトを常に再構築する必要があるためです。つまり、フォルダーとテキスト ファイルも追加する必要があります。それも毎回手作業で。
プロジェクトのビルド時に Java に META-INF/services/ フォルダーとテキスト ファイルを自動的に追加させる方法があることを本当に願っています。:)
ちなみに、ビルドプロセスを自動化するために内部でAntを使用しているNetbeansを使用しています。この情報は私の質問に関連している可能性があると思います。
ありがとう!
java - 同じFQNを持つ複数のクラス(ServiceLoader)
java.util.ServiceLoaderを使用して、軽量のプラグインフレームワークを作成しています。
私は現在、同じFQNで複数の実装クラスを作成する方法に取り組んでいます。クラスパスに同じプラグインの2つのコピーを置き、META-INF/servicesディレクトリにある両方の実装クラスにアクセスしたいと思います。
これが私が何を意味するかを説明するいくつかの簡単なEclipseプロジェクトです: https ://docs.google.com/open?id = 0B4MxFm-ACB3IUmswN0dpMExTVms
ServiceLoaderIntfには、プラグインによって実装されるシンプルなインターフェイスがあります。ProjectOneとProjectTwoはプラグインを表します。ServiceLoaderには、実装者を反復処理してinit()メソッドを呼び出すTesterクラスがあります。
実装クラスが同じFQNを持っている場合でも、どうすればすべての実装者を認識させることができますか?現在、ProjectOneのプラグインクラスを認識するだけです。
java - Java アプレットと ServiceLoader
Java アプレットは、デフォルトで someJar.jar!/META-INF/services/ からサービス クラスをロードせず、NoClassDefFoundError 例外が発生します。
それを機能させる方法は?
java - TomcatWebサーバーにデプロイされたAxis2WebサービスコードでのServiceLoaderの使用
UbuntuのTomcat、Axis2プラットフォームに.aarファイルをデプロイしています。Oracle JDK1.7Tomcat7.0.35とAxis21.6.2を使用しています
最近、java.util.ServiceLoaderクラスを使用して、いくつかのクラスの実装を動的にロードするようにリファクタリングを行いました。
これが私のaarファイル構造です:
私のEclipse開発環境では、メソッドは問題なく実行されますが、Axis2 Tomcatプラットフォームで実行されると、ServiceLoaderクラスは実装クラスをロードできません。何が問題になる可能性がありますか?どんな助けでも大歓迎です。ありがとう。
java - Java の ServiceLoader とテスト リソース
次のように、Java ServiceLoader 仕様の一部として Hibernate Integrator を定義する Web アプリケーションがあります。
src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
これは、こちらの Hibernate ガイドに従って行われます。
私の問題は、単体テストを実行しようとすると、メインのインテグレーター記述子がまだ解析され、インスタンス化されていることです。これは、単体テストでアプリケーションの大部分をモックしているため、インテグレーターが実行しようとするとエラーが発生し、テストが失敗することを意味します。
テスト リソースで同じファイルを定義しました。
src/test/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
しかし、代わりに、テスト ファイルとメイン インテグレーター ファイルの両方が解析されていることがわかりました。
テスト リソースがメイン リソースを上書きし、メイン リソースが陳腐化することを期待していましたが、そうはなりませんでした。test-classes
両方のファイルがクラスパス上にあるため (クラスパスにとの両方を配置する Surefire-plugin を使用して、Maven を介してテストを実行していますclasses
)。と同様のことが起こりpersistence.xml
ます。
私の単体テスト環境では、これらの Bean の構築をできるだけ手動で制御したいので、インテグレーターをインスタンス化したくありません。私が実行単位をテストしていることを考えると、テストの実行に影響を与える可能性のあるインテグレーターなどの追加の Bean が横たわっていることは望ましくありません。これは、単体テスト中の完全に正当な要件だと思います。ただし、主要なリソースは引き続き によって解析されますがServiceLoader
、これは不可能です。
私がやろうとしている解決策は、persistence.xml
ここに投稿された解決策に基づいています。
ServiceLoader
私の質問は、特にファイルのコンテキストで、名前の変更を強制するよりも、単体テスト中に処理されないように主なリソースを除外するより良い方法があるかどうかです。
もう少しうまく要約するには:
クラスパスに同じサービス インターフェイスにちなんで名付けられた 2 つのファイルがある場合はどうなるでしょうか。私には、両方のファイル内のすべてのサービスがインスタンス化されているようです。上書きはないようです。
java - NoClassDefFoundError を引き起こす ServiceLoader.next
私が正しいことをしたかどうか完全に確信が持てないので、私は尋ねています。Web プロジェクトに Eclipse を使用しています。package では WebProject (duh) と呼びましょうcom.web.project
。
実行時に WebProject に JAR プラグインをロードさせたいので、java.util.ServiceLoader
. そこでcom.web.project.WebProjectPlugin
、プラグインが実装する必要のあるすべてのメソッドを使用して、WebProject プロジェクトにインターフェイスを作成しました。
次に、プロジェクト PluginProject を作成し、ビルド パスに WebProbject/build/classes をクラス フォルダーとして追加します。
次に、プラグイン プロジェクトに META-INF/services フォルダーを作成し、com.web.project.WebProjectPlugin
「com.web.project.plugin.TestPlugin」という 1 行を含むテキスト ファイルを内部に配置しました。
追加された build/classes フォルダーをチェックアウトする JAR ファイルをエクスポートし、ハード ドライブのどこかに置きました。WebProject が起動すると、次の処理が行われます。
pluginsDir
はFile
、JAR ファイルがあるディレクトリを指すオブジェクトです。は空ではないsrvl
ため、最初は がその役割を果たしているように見えますが、 に到達するとiter
dreaded をスローします。NoClassDefFoundError
iter.next()
テスト用のプラグイン マネージャー プロジェクトを既に作成しておりServiceLoader
、問題なく動作しますが、これはプレーンなコンソール Java アプリケーションであり、Web プロジェクトではありません。それで、私はここで何が間違っていますか?
私は少し困惑しています:実行中の同じプロジェクトにあるのに、どうしてのクラス定義が見つからないのでしょうか? それは私が使用com.web.project.WebProjectPlugin
しているオブジェクトと関係がありますか?URLClassLoader
これがスタック トレースです。
android - apk に「META-INF/services」ファイルを保持する
JavaSE で既に動作しているカスタム文字セットがあります。
私の CharsetProvider のクラスは、にあるファイルjava.nio.charset.spi.CharsetProvider
で指定されMETA-INF/services
、すべてが正常にロードされ、期待どおりに動作します。
ただし、今は Android でも lib を使用していますが、文字セットが Android-App に読み込まれていません。
Androidアプリで期待どおりに使用できるように、文字セットを統合するにはどうすればよいですか?
現時点では、次のような回避策を行っています。
これは機能しますが、自分の文字セットでこのようにデコードしようとするたびに例外がスローされ、CharsetProvider-Object が作成されるため、効果がないように思えます。
もちろん、作成はシングルトンパターンによって削減できます。しかし、問題は MyCharsetProvider の直接使用を完全に避けることです。
編集 :
META-INF/services/java.nio.charset.spi.CharsetProvider
がapkにないので、プロガードが削除するかもしれませんが。次に、proguard.cfg で次のオプションを試しました。
しかし、問題はまだ解決していません。META-INF/services
ant(netbeans)を使用してこれらのファイルをapkから自動的に取得するにはどうすればよいですか?