4

1 つの親 pom-project と多数のモジュールを持つ maven マルチモジュール プロジェクトがあります。これらのモジュールの 1 つは、すべてのライブラリがシェーディングされた「メイン モジュール」です。他のすべてのモジュールはそのモジュールに依存し、提供されたライブラリを使用します。

メイン モジュールは、他のモジュールを拡張機能としてロードする Bukkit プラグインです。これらの拡張機能はすべて独自のクラスローダーでロードされますが、ロードされたクラスはローダー間で共有され、相互に依存できるようになっています。また、親クラスローダが Bukkit の PluginClassLoader であるため、他の Bukkit プラグインに依存することもできます。プラグイン間でロードされたクラスを共有して相互作用を可能にします。

ここから問題が発生します。異なるプラグインが同じライブラリを使用している可能性がありますが、そのライブラリのクラスが異なるクラスローダーによってロードされ、LinkageErrors やその他の問題が発生する可能性があります。

その問題を解決するための私の考えは、maven-shade-plugin を介してメイン モジュールのライブラリを再配置することでした。これは、メイン モジュールでのみ使用されるライブラリで期待どおりに機能します。ただし、他のモジュールが使用するライブラリを再配置すると、実行時に ClassNotFoundExceptions が発生します。これは、モジュールが再配置されたものではなく通常のパッケージ名を引き続き検索するためです。次に、インポートを再配置されたパッケージに変更しようとしましたが、IDE (IntelliJ) がクラスを見つけられません。

この移転の問題を解決する方法について誰か考えがありますか? それとも、クラスローディングの問題に対する異なるアプローチでしょうか?

4

2 に答える 2