为了加载未放置在我的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);
}
}
如果我不得不下赌注,我会说这是一个类加载器委托问题。它试图在系统类加载器中创建无法看到插件JAR的资源包。 – Perception 2012-03-13 10:32:25
嗯,如果是这种情况,你认为我必须用我自己的默认类加载器重写? – Waqas 2012-03-13 11:48:13
@Waqas'Perception'是对的我想,试着把sms.properties放到你的application/WEB-INF/classes中。并验证它是否正常工作。或者您可以尝试使用[此问题的选定答案]中的逻辑(http://stackoverflow.com/questions/2815404/load-properties-file-in-jar)。 – 2012-03-14 05:27:32