配置文件放在 WebContent/ 而非 src/,導致類路徑讀取失敗。需理解部署後目錄結構變化。
【源碼結構】 【部署後 WEB-INF/classes 結構】
src/ classes/
com/ com/
MyListener.class MyListener.class
WebContent/ (WebContent 下文件直接映射到 Web 應用根目錄)
test.txt
WEB-INF/
web.xml

MyListener.class 在 WEB-INF/classes/com/,目標 test.txt 在 Web 根目錄,需回溯兩級再進 web/(或直接 ../../test.txt 視具體映射)。
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
// 關鍵:從類所在包路徑回溯到 Web 根目錄
InputStream is = MyListener.class.getResourceAsStream(\"/../../web/test.txt\");
if (is != null) {
try {
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) > 0) {
System.out.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try { is.close(); } catch (IOException ignored) {}
}
}
}
// ...
}
Class.getResourceAsStream(path):以類文件所在目錄為基準解析相對路徑;以 / 開頭則以類路徑根為基準。src/ 編譯輸出到 WEB-INF/classes/;WebContent/ 內容映射到 Web 應用根目錄(與 WEB-INF/ 同級)。WEB-INF/classes/com/ 回溯 ../../ 到 WEB-INF/,再進 ../ 到 Web 根,或直接 ../../../test.txt 視具體深度。WEB-INF/classes/,直接 /test.txt 訪問。context.getResourceAsStream(\"/test.txt\"),無需回溯。@PropertySource、Spring Environment、或 JNDI 數據源,脫離 WAR 結構依賴。理解類路徑與 Web 根路徑的映射關係,是 Java Web 開發避坑必修課。