하나의 서버에 war 패키지로 배포 된 작업중인 Java 웹 응용 프로그램을 가지고 있었고 다른 서버 (Tomcat 7을 사용하는 두 서버)로 이동하면 다음 오류가 발생합니다.ServletContext.getRealPath()는 Tomcat 7에서 null을 반환합니다.
는HTTP Status 500 - Servlet.init() for servlet amie.demo.AMIEServlet threw exception
java.lang.NullPointerException java.io.File.(File.java:277) amie.demo.AMIEServlet.init(AMIEServlet.java:92)
문제를 일으키는 코드는 다음과 같습니다.
@Override
public void init(ServletConfig config) throws ServletException {
String kbPath = config.getServletContext().getInitParameter("kb-path");
String kbAbsPath = config.getServletContext().getRealPath(kbPath);
String metadataPath = config.getServletContext().getInitParameter("kb-metadata");
String metadataAbsPath = config.getServletContext().getRealPath(metadataPath);
try {
kb.load(new File(kbAbsPath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
문제는 config.getServletContext() getRealPath가 null 반환한다는 것입니다. 스 니펫에 언급 된 재산 "KB-경로는"web.xml 파일에 정의되어
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>AMIEDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>kb-path</param-name>
<param-value>yago2core.10kseedsSample.decoded.compressed.notypes.nolangcode.usascii.tsv</param-value>
</context-param>
<context-param>
<param-name>kb-metadata</param-name>
<param-value>yagoWikipediaInfo.relevance.sample.tsv</param-value>
</context-param>
</web-app>
이하 "KB 경로"속성에 의해 참조 파일은 .WAR 패키지의 루트에 있습니다. 앞에서 말했듯이 이전 서버에서 작동 했으므로 구성 문제가 의심됩니다. 어떤 힌트도 높이 평가 될 것입니다.
리소스는 파일 시스템이 아니라 전쟁 파일에 있습니다. 따라서 메서드는 문서화 된대로 null을 반환합니다. ServletContext.getResourceAsStream을 사용하여 리소스를로드하십시오. 그것들은 파일이 아니기 때문에 파일 IO가 아니라 war 파일에 임베드 된 자원입니다. –
또는 쓰는 것이 필요한 경우 tomcat을 구성하여 전쟁을 압축 해제하십시오. 덜 좋아. –
@JBNizet 나는 왜 당신이 코멘트에서 답변을 선택했는지 궁금하다. –