• 締切済み

アプリケーションサーバを再起動しなくてもクラスを読み込みたい

Webアプリケーションにおいて、プラグイン機構を考えています。 一度WebアプリケーションをTomcatに配備すると、更にjarファイルが 後から追加された場合、Tomcatを再起動しないと認識してくれません。 (Class.forName()やloadClass()) 使い方が悪いのかもしれませんが、再起動せずとも読み込めるように なるコーディング方法をご教示下さい。

みんなの回答

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1
naktak
質問者

お礼

なんかこんな感じで思うような動きはしてくれましたが、 お作法的にこんなのでいいのか全く分かりません・・・。 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();     }

naktak
質問者

補足

warファイルに含まれるクラスが、lib配下にあるjarファイルを見て、 ロード対象となるjarファイルから特定のクラスをインスタンス化する というような仕組みで考えています。 その上で、tomcat起動後にlib配下にjarファイルを追加し、 その後にtomcatを起動せず、jarファイル内にあるクラスを インスタンス化したい、というイメージです。