2012-03-13 77 views
2

为了加载未放置在我的Web应用程序的WEB-INF/lib文件夹中的外部JAR文件,我已经通过扩展org.apache.catalina.loader.WebappLoader类编写了自定义装载器类。通过自定义Tomcat Webapp Loader访问嵌入式资源

它在启动时会扫描文件夹(在我的情况下是cataline_home\plugins\),并将此文件夹中的所有类/ jar添加到我的Web应用程序的类路径中。

这一切工作正常,它加载所有可用的类,我甚至可以从我的应用程序执行它们;但由于某些原因,这些类无法访问JAR中的属性文件。

说我有JAR叫pluginsms.jar,这个JAR里面我有一个属性文件名为sms.properties,我使用ResourceBundle resource = ResourceBundle.getBundle("sms");阅读该文件,当我运行它作为独立的它工作完全正常,但是当我尝试加载它在我Web应用程序(通过自定义WebappLoader)它会抛出:Resource Not Found Exception

下面给出的是我WebappLoader来源:

public class PluginLoader extends WebappLoader { 

    @Override 
    public void setContainer(Container container) { 
     StandardContext ctx = (StandardContext) container; 

     try { 
      File pluginFolder = new File(System.getProperty("catalina.home"), 
        "plugins"); 

      for (File file : pluginFolder.listFiles()) { 
       if (file.isDirectory()) { 
        continue; 
       } 
       if (file.getName().endsWith(".jar")) { 
        addRepository(file.toURI().toString()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     super.setContainer(container); 
    } 
} 
+0

如果我不得不下赌注,我会说这是一个类加载器委托问题。它试图在系统类加载器中创建无法看到插件JAR的资源包。 – Perception 2012-03-13 10:32:25

+0

嗯,如果是这种情况,你认为我必须用我自己的默认类加载器重写? – Waqas 2012-03-13 11:48:13

+0

@Waqas'Perception'是对的我想,试着把sms.properties放到你的application/WEB-INF/classes中。并验证它是否正常工作。或者您可以尝试使用[此问题的选定答案]中的逻辑(http://stackoverflow.com/questions/2815404/load-properties-file-in-jar)。 – 2012-03-14 05:27:32

回答

0

什么我的猜测是,你的属性文件驻留在WEB-INF或网络内容的文件夹,并且您使用相对路径访问你的属性文件。虽然你想使用这个属性文件的罐子不能看到这个路径,这就是你得到这个异常的原因。我建议你使用属性文件的静态路径。我希望能帮助你。