問題タブ [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.
java - Serviceloader から取得したサブクラスが AbstractMethodError をスローする
抽象クラスを実装するプラグインをロードできる Java アプリを作成しようとしていますが、ServiceLoader から生成されたインスタンスで AbstractMethodError が発生しています。コードは少し重いので、以下に簡略化しました。
まず、抽象クラスがあります。
以下のインターフェースを実装します。
meta-inf/services フォルダーにNotAbstractClass
拡張して記載するサービス プロバイダーがあります。TheAbstractClass
次に、メイン アプリケーション (実際には別のアプリケーション内のプラグイン) で、拡張するすべてのクラスを見つけたいと思いますTheAbstractClass
。
私のアプリケーションはNotAbstractClass
. forループでできるので、これを知ってclass.getName()
いますanotherstuff.NotAbstractClass
が、エラーが発生します:
java.lang.AbstractMethodError: stuff.TheAbstractClass.getClassName()Ljava/lang/String;
私は困惑しています。なにか提案を?ありがとう、ペドロ
java - pomで依存関係が指定されていない場合、mavenを使用したServiceLoader
ServiceLoader
Maven アプリケーションがあり、このメカニズムを使用してプラグインをロードするのが好きです。
現在、依存関係をpomに追加することでこれを実現しているため、依存関係のjarがクラスパスにあり、ServiceLoaderがそれを取得できます。
しかし、 pom で依存関係を宣言せずにこれをどのように達成できますか?
使用するすべてのプラグインで pom を変更するのは好きではありません。
どうすればこれを行うことができますか、またはプラグイン jar は常に pom にある必要がありますか?
java - Java の汎用性とサービス
私のアプリケーションは ServiceLoader を使用しており、Algorithm と Exporter の 2 種類のサービスがあります。コード :
アルゴとエクスポーターを一緒に「配線」する別のクラス Executor があります。
チーム メンバーは、さまざまな種類のアルゴリズムとエクスポーターを個別にコーディングします。彼らはそれをjarに入れ、アルゴリズムまたはエクスポーターのいずれかであるサービスプロバイダーを登録し、アプリケーションのコアはこれらのモジュールを組み合わせることにあります.
私はその小さなテストを書きました:
しかし、私は前途に問題を予見しています。ローダーはアルゴリズムまたはエクスポーターの特定のタイプを認識していないため、2 つの組み合わせが互換性があることをどのように確認できますか? または、アルゴ/エクスポートが機能するタイプに応じて、サービスローダーでサービスをフィルタリングする方法はありますか? ありがとうございます
編集:より明確にするために:誰かがモジュールアルゴリズムをコーディングし、他の人がエクスポーターをコーディングするとしましょう。それらは ServiceLoader で同じ方法でロードされます。それらを区別する方法はありますか?
java - Android の ServiceLoader 「クラスをインスタンス化できませんでした」
ServiceLoader
をAndroid アプリに統合して、プラグイン システムを統合する際に問題があります。
externalStorage の assets フォルダーからコピーされた .jar ファイル。クラスはすべてのファイルにアクセスできますが、実行後にクラッシュします。
エラーを解決する方法を知っている人はいますか?
neo4j - glassfish4 で hibernate-ogm-neo4j を使用すると、「プロバイダはサブタイプではありません」という例外が発生する
グラスフィッシュ (4.1.1) で hibernate-ogm-neo4j (5.1.0.Alpha1) を実行しようとしています。アプリケーション サーバーを datastorprovider<property name="hibernate.ogm.datastore.provider" value="neo4j_embedded"/>
で起動すると、長いスタック トレースが表示され、次の例外が絶えず繰り返されます。
<property name="hibernate.ogm.datastore.provider" value="neo4j_bolt"/>
例外を使用すると、
Bolt モードで接続したいのですが、設定を誤ったのか、それとも hibernate-ogm または neo4j のバグなのかわかりません。
これは私の完全なpersistence.xmlです:
アップデート
エラーメッセージをもう少し詳しく調べました。実際にはJavaクラスでスローされ、のようなスーパークラスではないServiceLoader
と言っています。でももちろんそうですorg.neo4j.driver.internal.spi.Connector
org.neo4j.driver.internal.connector.socket.SocketConnector
また、 absolut class name と予想されるパスを含むMETA-INF.services
関連の説明もあります。neo4j-java-driver-1.0.4.jar
org.neo4j.driver.internal.connector.socket.SocketConnector
これは私をさらに混乱させます。この構成は自動的に行われないため、Glassfish に適用する必要がありますか?
更新 2
を使用すると問題は解消neo4j-java-driver-1.1.0-M6.jar
されます (pom で依存関係を宣言するだけで、hibernate-ogm-neo4j-5.1.0.Alpha1 にバンドルされている 1.0.4 の代わりに使用されます)。バージョン 1.0.x の何が問題なのかはまだわかりませんが、開発者に連絡して確認しました。
java - 別のパスを指す ClassLoader を使用する ServiceLoader
数日からこれを試してきましたが、うまくいきません!
コマンドラインから実行し、別のフォルダーにプラグイン (jar) を提供できるプラグイン可能な Java アプリケーションを構築しようとしています。それはServiceLoader
私の要件に合っているようですが、jarがクラスパスの一部ではなく、別の場所に保存されているという特別なケースが必要だと思います。このため、ClassLoder
このファイルシステムへのURLを指すを使用する必要があります道。
メイン アプリケーションに提供したいプラグインの 1 つは、いくつかのカスタム機能を備えたログ jar です。
ここで私が使用しているコードの下にありますが、for/loop に入ることができません..これは、ServiceLoader
クラスの実装を識別/一致させることができないことを意味します:
お役に立てれば幸いです!どうもありがとう
==== プロジェクト ファイルの追加:
主なプラグイン可能なアプリケーション:
「ログ」プラグイン
インターフェイスLog
その実装
- 構造
=================
プロジェクト構造を次のように調整しましたが、まだ機能しません: