dポイントプレゼントキャンペーン実施中!

Webアプリケーションにおいて、プラグイン機構を考えています。

一度WebアプリケーションをTomcatに配備すると、更にjarファイルが
後から追加された場合、Tomcatを再起動しないと認識してくれません。
(Class.forName()やloadClass())

使い方が悪いのかもしれませんが、再起動せずとも読み込めるように
なるコーディング方法をご教示下さい。

A 回答 (1件)

この回答への補足

warファイルに含まれるクラスが、lib配下にあるjarファイルを見て、
ロード対象となるjarファイルから特定のクラスをインスタンス化する
というような仕組みで考えています。

その上で、tomcat起動後にlib配下にjarファイルを追加し、
その後にtomcatを起動せず、jarファイル内にあるクラスを
インスタンス化したい、というイメージです。

補足日時:2010/03/10 23:23
    • good
    • 0
この回答へのお礼

なんかこんな感じで思うような動きはしてくれましたが、
お作法的にこんなのでいいのか全く分かりません・・・。

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();
    }

お礼日時:2010/03/11 00:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!