- 締切済み
クラスのロードが出来ない
あまり深くJavaを知らないうちからこんなことすることが無謀なのかも しれませんが、.NETやらPHPなら個人的に簡単にコーディングできるので、 Javaでも手法として覚えたいと思っています。 やりたいことは、AというWebアプリケーション上から、別にコンパイル されたBというjarファイルをロードし、インターフェースを介して動作させる、 といったものです。 Struts2.1.8を利用してコーディングしていますが、問題になっている部分では 大して問題にならないと思われます。 public class Index { public String execute() throws Exception { final String PLUGINS_DIRECTORY = "/plugins/"; //jarロード String filePath = ServletActionContext.getServletContext(). getRealPath(PLUGINS_DIRECTORY + "TestProject.jar"); String direcotryName = ( new File(filePath).getCanonicalFile().toURI()).toString(); System.out.println(direcotryName); URL url = new URL("jar:" + direcotryName + "!/"); URLClassLoader loader = new URLClassLoader( new URL[] {url}); //クラスの読み込み Object abc = loader.loadClass("testpackage.TestClass"); if (abc == null) { System.out.println("そもそもクラスを読めなかった"); } } } こんなスクリプトがあり、以下のディレクトリ構成を考えた時 (Index.classが上記コード) webroot --WEB-INF --classes --base --Index.class --plugin --PluginImpl.class --plugins --TestProject.jar TestProject.jarにはtestpackage.TestClassが存在するのですが、 スクリプト上ではエラーになってしまいます。 例外:java.lang.reflect.InvocationTargetException 原因:java.lang.NoClassDefFoundError: plugin/PluginImpl TestClassはplugin/PluginImplを実装したものなのですが、 どうもPluginImplが見つからずTestClassがNGになってる?みたいです。 外部jarをロードしてクラスを利用する場合の正しいやり方が分からず困っています。 正しいコードをご教示下さい。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Yanch
- ベストアンサー率50% (114/225)
クラスローダの自作やカスタマイズは難易度が高い方法か、JDKのバージョン に依存する方法になってしまうので、お勧めしません。 素直に、「WEB-INF」の下に「lib」ディレクトリを作成して、jarを配備しては いかがでしょう。
補足
ありがとうございます。 lib直下への配置については、コーディングする際に真っ先に却下しました。 理由としては、システムとして利用しているライブラリjarと、 後に任意で追加されたプラグインjarの区別が付かないから です。 出来たらプラグインは、プラグイン専用に切ったディレクトリ上 に存在して欲しいという思いです。 上記のことがスマートに解消されるならば、別に 質問に記述したような方法でなくて構いません。 他に良い解決案などありますでしょうか?