- 締切済み
アプリケーションサーバを再起動しなくてもクラスを読み込みたい
Webアプリケーションにおいて、プラグイン機構を考えています。 一度WebアプリケーションをTomcatに配備すると、更にjarファイルが 後から追加された場合、Tomcatを再起動しないと認識してくれません。 (Class.forName()やloadClass()) 使い方が悪いのかもしれませんが、再起動せずとも読み込めるように なるコーディング方法をご教示下さい。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- askaaska
- ベストアンサー率35% (1455/4149)
回答No.1
お礼
なんかこんな感じで思うような動きはしてくれましたが、 お作法的にこんなのでいいのか全く分かりません・・・。 final String PLUGINS_DIRECTORY = "WEB-INF/lib"; //jarのあるディレクトリ String cpath = ServletActionContext.getServletContext(). getRealPath(File.separator + PLUGINS_DIRECTORY); try { ArrayList<AbstractPlugin> plugins = new ArrayList<AbstractPlugin>(); //jarファイル分繰り返す File f = new File(cpath); String[] files = f.list(); for (int i = 0; i < files.length; i++) { if (files[i].endsWith(".jar")) { //マニフェストのPlugin-Classが存在するもののみ対象 File file = new File(cpath + File.separator + files[i]); JarFile jar = new JarFile(file); Manifest mf = jar.getManifest(); Attributes att = mf.getMainAttributes(); String cname = att.getValue("Plugin-Class"); if (cname != null) { //jarロード URL url = file.getCanonicalFile().toURI().toURL(); URLClassLoader loader = new URLClassLoader( new URL[] { url }, AbstractPlugin.class.getClassLoader()); Class cls = loader.loadClass(cname); //AbstractPluginを継承してるクラスのみインスタンス化 Class sClsObj = cls.getSuperclass(); if (sClsObj.equals(AbstractPlugin.class)) { AbstractPlugin plugin = (AbstractPlugin)cls.newInstance(); plugins.add(plugin); } } catch (Exception ex) { ex.printStackTrace(); }
補足
warファイルに含まれるクラスが、lib配下にあるjarファイルを見て、 ロード対象となるjarファイルから特定のクラスをインスタンス化する というような仕組みで考えています。 その上で、tomcat起動後にlib配下にjarファイルを追加し、 その後にtomcatを起動せず、jarファイル内にあるクラスを インスタンス化したい、というイメージです。