我有一个在Tomcat 8中运行的Web应用程序,这个Web应用程序war文件包含几个jar(通过Spring框架)。其中一个是名为connector.jar的jar。此connector.jar包含一个接收包名称的方法,该方法检查是否存在某个文件。我确信该文件存在(三重检查它,也在jar文件中),因此在开发中,当作为爆炸jar运行时,它返回true,但是当它被打包在一个罐子里并作为战争部署时Tomcat,它返回false。
请帮助我了解问题所在,以及如何解决或调试它?
方法:
public boolean isPresent(String packageName) {
return getClass().getClassLoader().getResource(packageName + "index.json") != null;
}
注意:
- 包名称示例:" com / bla / connector /" (包名称
不包含前导" /")。
- 我也使用了class.getResource(),但结果相同。在SO建议
如你所知,在jar中查找资源时不要使用它
错误的类加载器。我在同一场战争中使用ActiveMQ。
- 代码可以由队列消费者调用。但我不这么认为
我使用ClassLoader的方式有问题。
更新,根据要求提供更多细节:
- 我使用maven作为构建工具(最新版本),maven构建了战争。我使用默认的maven war布局。 WEB-INF / classes,WEB-INF / lib。 lib文件夹包含所有jar和connector.jar。
- 方法isPresent位于com.company.HtmlWorker类的connector.jar中。
- 文件index.json位于包中:com.company.json.account。
- 记录创建的index.json名称时输出isPresent方法:" com / company / json / account / index.json"