/home/user/project/target/classes/)。classpath: 前綴標識,指編譯輸出目錄(target/classes)及依賴 JAR 內部。| 代碼方式 | 返回內容 | 典型輸出示例 | 適用場景 |
|---|---|---|---|
Thread.currentThread().getContextClassLoader().getResource("") | Classpath 根路徑 (URL) | file:/project/target/classes/ | 通用、線程上下文類加載器 |
ClassLoader.getSystemResource("") | 系統類加載器 Classpath 根 | 同上 | 應用主類加載器 |
MyClass.class.getClassLoader().getResource("") | 當前類加載器 Classpath 根 | 同上 | 指定類加載器 |
MyClass.class.getResource("/") | Classpath 根路徑 (URL) | 同上 | 以 / 開頭=Classpath 根 |
MyClass.class.getResource("") | 當前類包路徑 (URL) | file:/project/target/classes/com/pkg/ | 相對當前類包 |
System.getProperty("user.dir") | 項目根目錄 (String) | /project | 讀取配置文件、項目相對路徑 |
System.getProperty("java.class.path") | 完整 Classpath 字符串 | /project/target/classes:/lib/a.jar:/lib/b.jar | 調試類加載問題 |
關鍵提示:
getResource返回URL,文件協議為file:,JAR 內資源為jar:file:...!/。獲取真實文件路徑請用url.toURI()再new File(uri),避免空格/中文編碼問題。
// 1. 請求相對路徑 (如 /myapp/page.jsp)
String requestURI = request.getRequestURI();
// 2. 當前 JSP 文件的絕對磁盤路徑
String realPath = application.getRealPath(request.getRequestURI());
// 3. Web 應用根目錄絕對路徑 (最常用)
String webRoot = application.getRealPath("/");
// 4. 當前 JSP 所在目錄的父目錄
File parentDir = new File(application.getRealPath(request.getRequestURI())).getParentFile();
// 1. Servlet 映射路徑 (如 /servlet/xxx)
String servletPath = request.getServletPath();
// 2. 請求資源的絕對磁盤路徑
String realPath = request.getSession().getServletContext().getRealPath(request.getRequestURI());
// 3. Web 應用根目錄絕對路徑 (推薦)
String webRoot = getServletConfig().getServletContext().getRealPath("/");
// ServletContext 獲取三大來源:
// request.getSession().getServletContext()
// getServletConfig().getServletContext()
// pageContext.getServletContext() (僅 JSP)
getRealPath 返回目標服務器展開後的路徑(如 webapps/ROOT/),非源碼 src/main/webapp。src/main/resources,使用 ClassLoader.getResourceAsStream() 讀取流,打包進 JAR 也能正常工作。ResourceLoader 或使用 @Value("classpath:config.yml"),框架屏蔽底層差異。File.separator 或 Paths.get() (NIO.2) 構建路徑。