从WAR文件读取文件时出现问题

时间:2016-08-18 12:52:55

标签: java

我有一个带有以下结构的war文件。

--js
  --sum.js
--WEB-INF
  --classes
    ---com
       -----test
           -----MyTest.class
--home.html

我正在尝试读取MyTest.class文件中的js文件,但是我在阅读时遇到异常。我尝试了堆栈中已经提到的大部分解决方案。

我试过了

1)

String path = Thread.currentThread().getContextClassLoader().getResource("js/sum.js").getPath();
        File f = new File(path);
        System.out.println(f.getAbsolutePath());

第一行是抛出nullpointer异常

2)

InputStream in =MyNashHornTest.class.getClassLoader().getResourceAsStream("/js/sum.js");
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

第二行是抛出空指针异常

3)

InputStream in =MyNashHornTest.class.getClassLoader().getResourceAsStream("../../../../js/sum.js");
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

第二行是抛出空指针异常

请帮我解决此问题。

2 个答案:

答案 0 :(得分:1)

对于war文件,不要使用servlet容器的类加载器,而是使用ServletContext。

此方法允许servlet容器从任何位置为servlet提供资源,而无需使用类加载器。

ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream("/yourfilename.txt");

如果您不希望浏览器能够访问它,建议将其保留在/ WEB-INF目录下。

路径必须以« / »开头,并被解释为相对于当前上下文根。如果指定路径中不存在任何资源,则此方法返回null。例如ServletContext.getResourceAsStream(« WEB-INF/resources/yourfilename.cnf »)将返回一个空例外,所以要小心!

为什么空指针来了?

路径必须以“/”开头,并被解释为相对于当前上下文根。如果指定路径中不存在任何资源,则此方法返回null。例如,使用不以斜杠开头的路径,您将获得空返回值。

详情说明如下:How to use ServletContext.getResourceAsStream(java.lang.String path)?

资源链接:

HOW TO: Read a file from jar and war files (java and webapp archive) ?

答案 1 :(得分:0)

您可以使用ClassLoader.getResource从类路径获取资源,也可以使用ServletContext.getResource从Web根目录获取资源。

在战争中,您使用前者来访问存储在WEB-INF/classes下的资源,或者存储在WEB-INF/lib下的jars中,而前者用于直接位于Web应用程序根目录下的资源。