首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ServletContext.getRealPath("/") 在 Eclipse Tomcat 返回 wtpwebapps 路徑的原因與替代方案

     編輯:程式設計綜合問答

現象

Ubuntu + Eclipse 部署項目 `OAobject`,調用 `servletContext.getRealPath("/")` 返回:

/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/OAobject/

期望獲取工作區源碼目錄 `/workspace/OAobject/`。

原因解析

Eclipse WTP(Web Tools Platform)發布機制:將項目複製到臨時目錄 `wtpwebapps` 模擬生產環境部署結構。`getRealPath` 返回的是當前運行時 Web 應用的物理部署路徑,而非源碼路徑。這是 Servlet 標準行為,與 IDE 無關。

常見誤區

試圖通過 `getRealPath` 讀取源碼目錄下的配置文件、模板文件。部署後源碼目錄不可用,僅部署產物(classes、lib、webapp)可用。

正確資源訪問模式

  1. 類路徑資源:放在 `src/main/resources`,編譯到 `WEB-INF/classes`。
    `getClass().getResourceAsStream("/config.properties")` 或 `servletContext.getResourceAsStream("/WEB-INF/classes/config.properties")`
  2. Web 內容資源:放在 `src/main/webapp`(或 `WebContent`)。
    `servletContext.getResourceAsStream("/templates/mail.ftl")` 返回 `InputStream`,不依賴文件系統路徑。
  3. 外部配置文件:使用絕對路徑配置(如 `/etc/myapp/config.yml`),通過環境變量或系統屬性注入路徑,`new FileInputStream(path)` 讀取。
  4. 臨時文件:`Files.createTempFile(prefix, suffix)` 或 `servletContext.getAttribute("javax.servlet.context.tempdir")` 獲取標準臨時目錄。

獲取項目源碼路徑(僅開發/測試)


// 僅適用於開發環境,生產環境不可靠
String projectRoot = new File("").getAbsolutePath(); // Eclipse 工作區路徑
String sourcePath = projectRoot + "/OAobject";

強烈不建議在業務代碼中依賴源碼路徑,打包部署後必失效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved