2016-05-04 15 views
1

クイック背景:
私は、ユーザーが独自のカスタムプラグインを作成できるようにする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を使ってこれらの機能をうまく組み合わせることができますか?

答えて

0

プラグインがこのジャーのスコープprovidedを使用している場合、これらのプラグインを実行するメインアプリケーションが実際にプラグインがアクセスできるクラスパス上にそのjarを提供していることを確認する必要があります。

はまた、このエラー:java.lang.NoClassDefFoundErrorは、根本的な原因ではありません。 アプリケーションログにそのエラーの最初のインスタンスがあり、そのエラーの根本原因が表示されます。クラスがクラスパスにない場合は、java.lang.ClassNotFoundExceptionになります。

+0

再構築とチェックの後、私は 'java.lang.ClassNotFoundException'を見ています。私はWARとして "親"アプリをデプロイしており、WEB-INF/libには必要なJARがあります。私は、親アプリで提供されたスコープとしての依存関係をマークしませんでした。子アプリ、提供、親アプリ、提供されていません(クラスパスに追加されることを望みますが、そうではありません)。 – Walls