2016-11-01 2 views
1

하나의 서버에 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 패키지의 루트에 있습니다. 앞에서 말했듯이 이전 서버에서 작동 했으므로 구성 문제가 의심됩니다. 어떤 힌트도 높이 평가 될 것입니다.

+2

리소스는 파일 시스템이 아니라 전쟁 파일에 있습니다. 따라서 메서드는 문서화 된대로 null을 반환합니다. ServletContext.getResourceAsStream을 사용하여 리소스를로드하십시오. 그것들은 파일이 아니기 때문에 파일 IO가 아니라 war 파일에 임베드 된 자원입니다. –

+0

또는 쓰는 것이 필요한 경우 tomcat을 구성하여 전쟁을 압축 해제하십시오. 덜 좋아. –

+0

@JBNizet 나는 왜 당신이 코멘트에서 답변을 선택했는지 궁금하다. –

답변

2

리소스는 파일 시스템이 아닌 war 파일에 있습니다. 따라서 메서드는 문서화 된대로 null을 반환합니다.

ServletContext.getResourceAsStream()을 사용하여 리소스를로드하십시오. 그것들은 파일이 아니기 때문에 파일 IO가 아니라 war 파일에 임베드 된 자원입니다.

0

디렉토리가 존재하지 않으면 새로운 디렉토리가 생성됩니다.

String uploadsDir = "/uploads/"; 
String realPathtoUploads = request.getSession().getServletContext().getRealPath(uploadsDir); 

if (!new File(realPathtoUploads).exists()) { 
    new File(realPathtoUploads).mkdir(); 
}