クイック背景:
私は、ユーザーが独自のカスタムプラグインを作成できるようにするJavaサービスプロバイダインタフェースを設定しています。彼らが実装しているインターフェースは、それ自身のスタンドアロンパッケージに入っていますので、他のかさばるコードなしで、より小さなパッケージをリリースすることができます。Mavenの依存関係およびJavaサービスプロバイダインタフェース
ユーザーが自分のJARを作成すると、彼らは動的に(私はSOにここで見つけること)、いくつかの反射ハックを使用して、実行時にアプリケーションにロードすることができます。これらはうまくいくようですが、私が別の開発者マシン(およびJenkinsボックス)に移動するとすぐに、依存関係が何とか消え始めます。
インタフェースのJARは、メインアプリ、小さいユーザが作成したプラグインの両方の依存性です。ユーザーがJARをアップロードするとき、その依存関係を含むJARを使用しているため、インターフェースが同じであることが保証されます。これにより、Java SPIはそれを取得して使用可能にすることができます。私はこの修正を望んで<scope>provided</scope>
として依存関係を使用するようにユーザーパッケージを切り替えることを開始しましたorg.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.util.ServiceConfigurationError: com.company.interface.MyInterface: Provider com.usercode.ClassName not a subtype
。
ユーザー瓶にロードしようとしたとき、私はjava.lang.NoClassDefFoundError: com/company/interface/MyInterface
の異なるエラーに遭遇してスコープを使用。
誰もが、このインタフェースJARとMavenを使ってこれらの機能をうまく組み合わせることができますか?
再構築とチェックの後、私は 'java.lang.ClassNotFoundException'を見ています。私はWARとして "親"アプリをデプロイしており、WEB-INF/libには必要なJARがあります。私は、親アプリで提供されたスコープとしての依存関係をマークしませんでした。子アプリ、提供、親アプリ、提供されていません(クラスパスに追加されることを望みますが、そうではありません)。 – Walls