
1. 項目概述為什么你的JavaWeb項目總出404每次新建JavaWeb項目時最讓人抓狂的就是部署后瀏覽器里那個刺眼的404。明明代碼沒問題路徑也檢查了無數(shù)遍可Tomcat就是找不到你的頁面。這種情況我見過太多——新手在搭建第一個Maven管理的JavaWeb項目時90%的部署問題都源于幾個關(guān)鍵配置的缺失或錯誤。Maven作為Java項目的標(biāo)準(zhǔn)構(gòu)建工具雖然簡化了依賴管理但它的目錄結(jié)構(gòu)和傳統(tǒng)JavaWeb項目存在差異。很多人直接套用老教程里的web.xml配置或者忽略了Maven特有的資源過濾機制導(dǎo)致編譯后的文件根本沒被正確打包到war包里。更棘手的是不同版本的IDEA和Tomcat對部署方式的支持也有差異這進一步增加了排查難度。2. 環(huán)境準(zhǔn)備避開版本兼容的坑2.1 工具選型建議JDK版本推薦JDK8或JDK11LTS版本避免使用最新發(fā)布的JDK。我曾遇到JDK17與舊版Tomcat的兼容性問題報錯信息完全不指向真實原因。Maven版本選擇3.6.x系列最新為3.6.3不要盲目追新。Maven 3.8開始強制使用HTTPS訪問中央倉庫國內(nèi)環(huán)境容易出問題。驗證安裝mvn -v應(yīng)顯示類似Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)Tomcat版本8.5.x或9.0.x最穩(wěn)定。注意Tomcat 10的Jakarta EE與JavaEE不兼容需要修改所有javax.*導(dǎo)入為jakarta.*。2.2 IDEA配置關(guān)鍵項Maven Runner設(shè)置勾選Delegate IDE build/run actions to MavenVM Options添加-DarchetypeCataloginternal避免聯(lián)網(wǎng)下載模板卡住Tomcat配置陷阱Application context必須帶/如/demoDeployment選項卡下確保Application context與Artifact的Web facet中配置一致3. 項目創(chuàng)建從原型到可運行骨架3.1 正確的Maven命令不要使用IDEA自帶的Web Application模板正確的做法是通過Maven原型創(chuàng)建mvn archetype:generate -DgroupIdcom.yourcompany -DartifactIddemo \ -DarchetypeArtifactIdmaven-archetype-webapp -DinteractiveModefalse這個命令會生成標(biāo)準(zhǔn)目錄結(jié)構(gòu)demo ├── pom.xml └── src └── main ├── resources ├── webapp │ └── WEB-INF │ └── web.xml └── java3.2 POM文件關(guān)鍵配置project ... packagingwar/packaging dependencies !-- Servlet API -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version3.1.0/version scopeprovided/scope /dependency /dependencies build finalNamedemo/finalName plugins !-- 解決Maven編譯版本問題 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target /configuration /plugin /plugins /build /project警告不要省略packagingwar/packaging這會導(dǎo)致項目無法被識別為Web應(yīng)用。4. 解決404問題的實戰(zhàn)步驟4.1 驗證部署結(jié)構(gòu)的正確姿勢運行mvn package后用解壓工具檢查生成的war包結(jié)構(gòu)demo.war ├── META-INF └── WEB-INF ├── classes ├── lib └── web.xml常見錯誤缺少WEB-INF/web.xml→ 檢查src/main/webapp/WEB-INF目錄是否存在classes目錄為空 → 確認src/main/java下的源碼是否編譯4.2 動態(tài)資源訪問404的解決方案假設(shè)有一個ServletWebServlet(/hello) public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) { resp.getWriter().write(Hello World); } }訪問http://localhost:8080/demo/hello報404按以下步驟排查注解掃描問題確保web.xml的metadata-completefalse默認值或改用傳統(tǒng)配置servlet servlet-namehello/servlet-name servlet-classcom.yourcompany.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping類加載問題檢查Tomcat日志是否有ClassNotFoundException確認WEB-INF/classes下存在編譯后的.class文件4.3 靜態(tài)資源加載失敗的修復(fù)方案把index.html放在src/main/webapp下訪問http://localhost:8080/demo/index.html仍404案例1文件被Maven過濾掉了在pom.xml中添加resources resource directorysrc/main/webapp/directory targetPathWEB-INF/targetPath includes include**/*.*/include /includes /resource /resources案例2Tomcat配置了錯誤的docBase在IDEA的Tomcat配置中Deployment → Artifact → 選擇war exploded不要勾選Deploy applications as separate directories5. 高級調(diào)試技巧與日志分析5.1 查看Tomcat真實部署路徑在IDEA控制臺找到類似日志[INFO] Deploying web application directory [/path/to/apache-tomcat-8.5.75/webapps/demo]直接檢查該目錄下的文件結(jié)構(gòu)比在IDE里看更可靠。5.2 開啟詳細日志在conf/logging.properties中添加org.apache.catalina.core.ContainerBase.[Catalina].level FINE重啟Tomcat后控制臺會顯示每個請求的完整URL映射過程資源加載失敗的具體原因5.3 常見錯誤代碼速查表現(xiàn)象可能原因解決方案404 源服務(wù)器未能找到目標(biāo)資源的表示URL拼寫錯誤檢查瀏覽器地址欄與WebServlet或web.xml的匹配404 請求的資源不可用類未編譯運行mvn compile后重新部署空白頁靜態(tài)資源路徑錯誤使用絕對路徑${pageContext.request.contextPath}/css/style.css500 Error instantiating servlet class依賴缺失檢查WEB-INF/lib下是否有相關(guān)jar包6. 真實項目中的避坑經(jīng)驗熱部署陷阱修改Java代碼后必須mvn compile才會生效靜態(tài)資源修改后需要Build → Rebuild ProjectIDEA路徑處理黃金法則!-- 錯誤示范 -- link hrefcss/style.css relstylesheet !-- 正確做法 -- link href${pageContext.request.contextPath}/css/style.css relstylesheet多模塊項目特殊處理 如果Web模塊依賴其他模塊需要在依賴模塊的pom.xml中添加build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.3.2/version configuration attachClassestrue/attachClasses /configuration /plugin /plugins /build數(shù)據(jù)庫連接池配置 推薦使用HikariCP但要注意把配置文件放在src/main/resources而非webapp下# src/main/resources/db.properties jdbcUrljdbc:mysql://localhost:3306/demo usernameroot password123456然后在Servlet中通過類加載器讀取InputStream is getClass().getClassLoader().getResourceAsStream(db.properties); Properties props new Properties(); props.load(is);這些經(jīng)驗都是我在解決數(shù)百個學(xué)生項目中的404問題后總結(jié)的。最后記住一個原則當(dāng)出現(xiàn)404時第一反應(yīng)應(yīng)該是檢查部署后的實際文件結(jié)構(gòu)而不是反復(fù)修改代碼。用tree /f命令Windows或ls -RLinux/Mac查看生成目錄往往能立即發(fā)現(xiàn)問題所在。