我有一個Web應用程序,它由以前在Linux機器上運行的一些JSP組成。我需要在運行Tomcat 5.5.29的Windows XP SP3機器上運行它。現在大多數所有的東西都在工作,但這一項:應用程序有能力將配置文件寫入其Windows目錄(即C:\ Program Files \ Apache \ Tomcat \ webapps \ myapp)。但是當它嘗試這樣做時,應用程序無法打開FileOutputStream(返回null)。如果我放棄路徑說明符,並讓它打開文件,它會在Tomcat目錄中成功打開它。爲JSP/Tomcat/Windows設置目錄權限
第一行失敗,但第二個成功:
// outputFile2 = new PrintWriter(new FileOutputStream(basePathName + "programAll.txt", false));
outputFile2 = new PrintWriter(new FileOutputStream("programAll.txt", false));
下面是創建的basePathName的代碼:
String basePathName = getBaseFilePath();
...
public String getBaseFilePath()
{
String curDir = System.getProperty("catalina.home");
curDir = curDir + "/webapps/pubmed/";
curDir = "file:///" + formatPathNameForOS(curDir);
return curDir;
}
public String formatPathNameForOS(String pathName)
{
if (codeIsOnWindows())
{
pathName = pathName.replace('/','\\');
}
else
{
pathName = pathName.replace('\\','/');
}
return pathName;
}
這裏的異常消息:
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error() that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:321)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:257)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
root cause
java.lang.NullPointerException
org.apache.jsp.updateMemberLists_jsp._jspService(updateMemberLists_jsp.java:1492)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:321)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:257)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
以下是堆棧跟蹤:
Aug 6, 2010 1:20:39 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.updateMemberLists_jsp._jspService(updateMemberLists_jsp.java:1492)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:321)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:257)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.globus.tomcat.coyote.valves.HTTPSValve55.invoke(HTTPSValve55.java:45)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
我已經看過了updateMembersLists_jsp.java,並且這裏是空指針發生的部分:
//create a file to write to the output
PrintWriter outputFile2 = null;
try
{
outputFile2 = new PrintWriter(new FileOutputStream(basePathName + "programAll.txt", false));
// outputFile2 = new PrintWriter(new FileOutputStream("programAll.txt", false));
}
catch (FileNotFoundException e)
{
out.write("<p><font color='red'>Error Saving</font></p>");
}
outputFile2.print(output); // THIS IS LINE 1492 -- NULL POINTER
outputFile2.close();
另外:我們現在運行Tomcat關閉根目錄,而不是程序文件的。我檢查了basePathName並且它正在被正確計算。
現在我發現Tomcat的策略設置可能需要調整。我在catalina.policy中添加了以下幾行,希望它能夠設置正確的內容:
// The permissions granted to the pubmed webapp
grant codeBase "file:${catalina.home}/webapps/pubmed/-" {
permission java.io.FilePermission "${catalina.home}/webapps/pubmed/-", "read, write";
permission java.io.FilePermission "${catalina.home}/webapps/pubmed/*", "read, write";
};
這似乎沒有任何效果。 tomcat正在運行的Windows用戶對pubmed目錄具有讀/寫權限。除了這個webapp將文件寫入自己的目錄似乎有問題之外,我錯過了什麼?
肖恩
什麼是basePathName? – naikus 2010-08-06 16:17:03
好問題。這是 文件:/// C:\ Program Files \ Apache Software Foundation \ Tomcat 5.5 \ webapps \ pubmed \ – BridgetG 2010-08-06 16:21:38
對不起另一個問題:你如何獲得它? – naikus 2010-08-06 16:38:22