从 WAR 文件读取文件时出现问题
Issue while reading a file from WAR file
我有一个具有以下结构的 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());
第一行抛出空指针异常
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));
第二行抛出空指针异常
请帮我解决这个问题。
对于 war 文件,不要使用 servlet 容器的 classloader,而是使用 ServletContext。
此方法允许 servlet 容器从任何位置为 servlet 提供资源,而无需使用 class 加载程序。
ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream("/yourfilename.txt");
如果不希望浏览器访问,建议放在/WEB-INF目录下
路径必须以 « / »
开头,并被解释为相对于当前上下文根。如果指定路径上不存在资源,则此方法 return 为 null。例如 ServletContext.getResourceAsStream(« WEB-INF/resources/yourfilename.cnf »)
将 return 一个 nul 异常,所以要小心 !
为什么会出现空指针??
路径必须以“/”开头,并被解释为相对于当前上下文根。如果指定路径上不存在资源,则此方法 return 为 null。例如,使用不以斜杠开头的路径,您将得到一个空 return 值。
详细说明在这里:How to use ServletContext.getResourceAsStream(java.lang.String path)?
资源Link:
HOW TO: Read a file from jar and war files (java and webapp archive) ?
您可以通过ClassLoader.getResource
从class路径获取资源,或者通过ServletContext.getResource
从网络根目录获取资源。
在 war 中,您使用前者访问存储在 WEB-INF/classes
下或 WEB-INF/lib
下的 jars 中的资源,而前者用于访问直接位于 WEB-INF/classes
下的资源网络应用程序。
我有一个具有以下结构的 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());
第一行抛出空指针异常
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));
第二行抛出空指针异常
请帮我解决这个问题。
对于 war 文件,不要使用 servlet 容器的 classloader,而是使用 ServletContext。
此方法允许 servlet 容器从任何位置为 servlet 提供资源,而无需使用 class 加载程序。
ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream("/yourfilename.txt");
如果不希望浏览器访问,建议放在/WEB-INF目录下
路径必须以 « / »
开头,并被解释为相对于当前上下文根。如果指定路径上不存在资源,则此方法 return 为 null。例如 ServletContext.getResourceAsStream(« WEB-INF/resources/yourfilename.cnf »)
将 return 一个 nul 异常,所以要小心 !
为什么会出现空指针??
路径必须以“/”开头,并被解释为相对于当前上下文根。如果指定路径上不存在资源,则此方法 return 为 null。例如,使用不以斜杠开头的路径,您将得到一个空 return 值。
详细说明在这里:How to use ServletContext.getResourceAsStream(java.lang.String path)?
资源Link:
HOW TO: Read a file from jar and war files (java and webapp archive) ?
您可以通过ClassLoader.getResource
从class路径获取资源,或者通过ServletContext.getResource
从网络根目录获取资源。
在 war 中,您使用前者访问存储在 WEB-INF/classes
下或 WEB-INF/lib
下的 jars 中的资源,而前者用于访问直接位于 WEB-INF/classes
下的资源网络应用程序。