路徑問題困擾無數 Java 開發者。本文系統梳理 Web 容器、獨立應用、JSP/Servlet、ClassLoader 等場景下的絕對/相對路徑獲取方法,附路徑轉換最佳實踐。
| 場景 | API | 返回示例 | 說明 |
|---|---|---|---|
| Web 應用根目錄 | getServletContext().getRealPath("/") | E:/workspace/project/ | 僅 ServletContext 可用處 |
| Classes 目錄 | this.getClass().getClassLoader().getResource("").getPath() | E:/workspace/project/WEB-INF/classes/ | 通用,非 Web 也可用 |
| 上下文路徑 | request.getContextPath() | /project | 用於生成頁面鏈接 |
| 請求 URI | request.getRequestURI() | /project/module/action.do | 含上下文路徑 |
| 當前文件絕對路徑 | request.getRealPath(request.getServletPath()) | E:/workspace/project/module/action.do | JSP 中常用 |
// 當前工作目錄
String cwd = System.getProperty("user.dir"); // 推薦
File f = new File("."); String path = f.getAbsolutePath();
// 類所在目錄(編譯輸出目錄)
String classPath = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();
// 或
String classPath = MyClass.class.getResource("").getPath(); // 包目錄
String classPath = MyClass.class.getResource("/").getPath(); // classpath 根
/ 代表應用根),用於 forward、sendRedirect(需加上下文路徑)。https://host/),用於 HTML form action、JS/CSS/圖片引用。統一前綴 ${pageContext.request.contextPath}。./、../ 相對當前文件路徑,部署遷移極易失效。public class PathUtils {
public static String getWebRoot() {
return System.getProperty("user.dir") + File.separator;
}
public static String getClassRoot() {
return PathUtils.class.getClassLoader().getResource("").getPath();
}
public static String toAbsolute(String relative) {
return new File(relative).getAbsolutePath();
}
}
路徑本質是「從哪裡開始找」。Web 環境以 ServletContext 為錨,獨立應用以 user.dir 為錨,ClassLoader 以 classpath 為錨。牢記三類錨點,路徑問題不再亂。