【发布时间】:2013-01-28 09:38:37
【问题描述】:
我有一个在 tomcat 7 下运行的 Web 应用程序,并且在其中一个类中,我试图读取 WEB-INF/lib 文件夹下的一个 jar 中的文件。
URL resourceURL = MyClass.class.getClassLoader().getResource("xml/xslt/master.xsl");
File xslfile = new File(resourceURL.getPath());
AssertUtil.assertTrue(xslfile.exists(),"xsl file not found");
MyClass 和 master.xsl 都在同一个 jar 中,打包没有问题。但是上面的 sn-p 在断言语句中失败,因为xslfile.exists 返回 false。 URL 正确解析为 jar 中文件的位置,如下所示
file:/<MY_WEBAPP_LOCATION>/MyApp/WEB-INF/lib/MyComponent.jar!/xml/xslt/master.xsl
其中 MY_WEBAPP_LOCATION 对应于我的 tomcat 服务器 webapp 目录的绝对路径。
但是如果我重写下面的代码以读取为输入流,它就可以正常工作。
InputStream xslFile = MyClass.class.getClassLoader().getResourceAsStream("xml/xslt/master.xsl");
任何人都可以解释是什么阻止了从 jar 资源创建文件,而输入流创建工作正常。是否需要从 tomcat 端进行任何其他权限设置才能读取 jar 内的文件?
编辑:再观察一下,如果文件放在 WEB-INF/classes 下,则使用上述代码创建文件可以正常工作。问题仅在于将其放置在 WEB-INF/lib 下的 jar 中
【问题讨论】:
-
能否请您澄清一下master.xsl文件是否在MyClass的同一目录结构中?如果 getResource(...) 路径不以“/”开头,那么它只会将 MyClass 文件包路径附加到您提到的 xls 路径中。
-
在上面的代码中,如果我添加一个前导斜杠 MyClass.class.getClassLoader().getResource("/xml/xslt/master.xsl"),它会返回一个空 URL 对象
标签: java file-io classloader tomcat7