版+Spring Boot+Web項目從創(chuàng)建到運行完整指南)
先別急著卸載IDEA社區(qū)版。昨天一個剛學Java的讀者跟我抱怨他按照教程裝了免費的IDEA Community Edition結果新建項目時怎么都找不到Spring Initializr那個熟悉的向導懷疑自己是不是裝了個殘缺版本。這里明確說一句社區(qū)版完全能開發(fā)Spring Boot Web項目而且日常夠用只是創(chuàng)建項目這一步需要繞個小路。這篇文章我就圍繞“IDEA社區(qū)版 Spring Boot Web項目 Java”這條主線把從零開始到跑通第一個接口的完整過程講清楚。版本選型、項目創(chuàng)建、導入IDEA、寫接口、踩坑排查每一步都會解釋背后的邏輯不只是給操作步驟。適合剛接觸Java Web開發(fā)的新手也適合從旗艦版轉社區(qū)版的開發(fā)者快速上手。1. 項目概述與準備清單1.1 社區(qū)版真正缺了什么很多初學者對IDEA社區(qū)版有一個誤解覺得它“不能搞Spring Boot”。準確地說社區(qū)版和旗艦版在Spring Boot開發(fā)上的差距核心就集中在項目創(chuàng)建階段旗艦版內置了Spring Initializr向導新建項目時直接勾選依賴、選版本幾步搞定社區(qū)版沒有這個入口所以你翻遍New Project向導也找不到Spring Initializr。但除了“創(chuàng)建項目”這一步其他方面差距沒有想象中那么大。社區(qū)版保留了完整的Java編碼能力、Maven集成、Git版本管理、終端、調試器和常用插件體系。Community Edition下的Lombok插件、MyBatis插件也都是能正常安裝使用的。也就是說一旦項目創(chuàng)建出來你后續(xù)寫代碼、調接口、跑測試的日常體驗和旗艦版不會有本質區(qū)別。當然旗艦版還有一些額外功能比如Spring Bean的圖形化依賴圖、JPA面板、Spring Boot運行配置的專屬工具窗口等。但這些屬于錦上添花對于學習階段或者中小項目開發(fā)社區(qū)版足夠應付。如果你的目標是個人學習、課程作業(yè)、畢業(yè)論文或者普通的后端接口開發(fā)免費社區(qū)版完全不丟人更不用去找那些亂七八糟的激活方案。1.2 版本選型先別急著裝最新這幾年Spring Boot的版本迭代很快網(wǎng)上教程推薦的版本也五花八門很多人一上來就裝最新版結果編譯報錯然后開始懷疑人生。其實大部分問題都出在JDK版本和Spring Boot版本不匹配上。這里我直接給出我平時給新人推薦的組合使用場景JDK版本Spring Boot版本說明老項目維護、企業(yè)常見JDK 82.7.x兼容性好資料多新項目學習、常規(guī)開發(fā)JDK 173.2.x或3.3.x官方當前主流嘗鮮新特性JDK 213.4.x部分新特性需要核心原則就是Spring Boot 3.x 強制要求 JDK 17 及以上如果本機只有 JDK 8就老老實實用 Spring Boot 2.7.x別硬上 3.x。怎么查自己的JDK版本命令行執(zhí)行java -version就能看到。如果還沒裝JDK優(yōu)先裝 JDK 17這是當前最穩(wěn)妥的選擇向下兼容性最好。IDEA社區(qū)版的版本建議在2022.3以上越新越好去官方網(wǎng)站下載就行。Maven的話不強制單獨安裝因為IDEA自帶了一個Bundled Maven新手直接用內置的就行。不過后面我會講如果依賴下載很慢建議手動裝一個Maven或者用自定義的settings.xml配置鏡像會舒服很多。2. 創(chuàng)建Spring Boot Web項目的完整流程2.1 核心思路把“向導”搬到瀏覽器里既然社區(qū)版沒有Spring Initializr入口那我們就換一條路直接用Spring官方提供的在線項目生成服務 start.spring.io。這個網(wǎng)站在IDEA旗艦版的向導里本質上也是套了一層殼底層用的還是同一套服務所以生成的下載包結構和IDEA向導生成的完全一致。用生活場景打個比方旗艦版相當于廚房里自帶一口炒鍋你在自家廚房就能炒菜社區(qū)版廚房里沒這口鍋但沒關系官方后廚早就把半成品打包好了你拿回來倒進自己的鍋加熱一下端上桌的菜是一樣的。你真正要掌握的是在這個在線頁面上把“半成品”的配料選對然后拿回來自己處理。2.2 在start.spring.io上選好項目參數(shù)打開 start.spring.io 之后你會看到一個表單頁面這里面的每個參數(shù)都值得認真選因為它們直接決定項目的基礎結構。Project選Maven。Gradle雖然也很優(yōu)秀但國內多數(shù)教程和公司項目還是Maven居多有問題好搜資料。Language選Java沒懸念。Spring Boot選穩(wěn)定版本。頁面左側會列出當前推薦版本一般選不帶SNAPSHOT后綴的穩(wěn)定版比如3.3.x。不要盲目選最新版新版本可能依賴一些新JDK特性反而增加折騰成本。Group一般寫 com.example或者用自己的域名反寫這對應Maven的坐標。Artifact項目名比如 hello-web 或者 demo對應倉庫里的子目錄名也決定Spring Boot啟動類的默認名稱。Packaging選Jar。這一點很關鍵很多從傳統(tǒng)SSH項目轉過來的人習慣性想選War但Spring Boot自帶內嵌Tomcat默認就按可執(zhí)行Jar來運行不用再單獨裝Tomcat服務器這是它極大的便利。Java選你本機的JDK版本如果本機是JDK 17這里就選17。頁面下方是Dependencies依賴選擇新手第一次做Web項目只勾一個Spring Web就夠了。Spring Web這個依賴就是把Spring MVC和內置Tomcat打包在一起了你寫的Controller能通過HTTP接口訪問全靠它。其他依賴比如Spring Boot DevTools、MySQL Driver、MyBatis第一遍先不加跑通基礎流程后再往pom.xml里引入這樣問題定位會更清晰。選完之后點擊Generate瀏覽器會下載一個zip壓縮包。這就是項目的骨架。2.3 導入IDEA并完成首次刷新下載下來的zip要先解壓。這里有個小細節(jié)很多壓縮軟件解壓后會多套一層目錄比如你下載的是 hello-web.zip解壓出來可能是 hello-web/hello-web/ 這種嵌套結構。只要找到里面那個同時包含pom.xml的目錄即可這才是真正的項目根目錄。打開IDEA社區(qū)版點 File - Open選中項目根目錄或直接選中里面的pom.xml文件IDEA會識別為Maven項目并彈出一個信任窗口選擇Trust Project。之后IDEA會自動開始解析pom.xml并下載依賴第一次會比較慢因為要去中央倉庫拉取Spring Boot全家桶的依賴。這里我建議提前配置Maven鏡像否則國內網(wǎng)絡條件下首次下載依賴可能會卡到懷疑人生。在用戶目錄下的.m2文件夾里新建settings.xml寫入以下內容?xml version1.0 encodingUTF-8? settings xmlnshttp://maven.apache.org/SETTINGS/1.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd localRepository你自己的本地倉庫路徑/localRepository mirrors mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共倉庫/name urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrors /settings然后在IDEA里打開 Settings - Build, Execution, Deployment - Build Tools - Maven把User settings file指向這個文件。如果本機裝了獨立Maven也可以直接改Maven安裝目錄下的conf/settings.xml。配好鏡像后依賴下載速度會有質的提升。依賴拉取完成的標志是IDE右下角進度條消失同時Maven工具窗口里不再有報錯信息。這時候打開左側的src/main/java/com/example/helloweb/HelloWebApplication.java你會看到Spring Boot標準的主類結構。3. 從啟動類到第一個Web接口3.1 項目結構里的三個關鍵位置一個標準的Spring Boot項目結構上有幾個地方必須要看懂。hello-web/ ├── pom.xml ├── src/main/java/com/example/helloweb/ │ ├── HelloWebApplication.java │ └── controller/ │ └── HelloController.java └── src/main/resources/ └── application.propertiespom.xml是Maven項目的核心配置文件Spring Boot的版本、所有依賴、構建插件都在這里聲明。application.properties是Spring Boot的默認配置文件端口、數(shù)據(jù)庫連接等核心參數(shù)以后都會寫在這里。HelloWebApplication.java就是啟動類它的方法上有一個主入口右鍵直接運行。啟動類上的SpringBootApplication注解看著不起眼實際上它組合了三個功能SpringBootConfiguration聲明這是一個配置類EnableAutoConfiguration開啟自動裝配ComponentScan開啟組件掃描。其中最容易出問題的就是組件掃描它默認掃描當前啟動類所在的包以及所有子包。如果項目里某個包名和啟動類不在同一個根目錄下Spring就找不到那個包里的Controller接口訪問就404。這個規(guī)則我給所有初學者都強調過項目里Controller、Service、Mapper這些組件必須放在啟動類所在包的子包下不能和啟動類平級亂放更不能放在啟動類所在包的外面。3.2 寫一個最簡單的REST接口項目骨架跑起來之后我們來寫第一個接口。在啟動類同級目錄下新建controller包然后在包里創(chuàng)建HelloController.javapackage com.example.helloweb.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { GetMapping(/hello) public String hello() { return Hello Spring Boot; } }這個代碼里有兩個注解值得說明。RestController是Spring 4之后引入的組合注解它相當于Controller加上ResponseBody也就是說方法返回的字符串會直接以HTTP響應的形式寫回瀏覽器不會再走視圖解析器去找JSP頁面。如果寫Controller你還需要配合模板引擎或者手動加ResponseBody新手階段直接用RestController最省心。GetMapping(/hello)表示這個方法處理HTTP GET請求訪問路徑為/hello。如果你想順手看看JSON格式的效果可以再補一個接口GetMapping(/info) public java.util.MapString, String info() { return java.util.Map.of(name, hello-web, status, ok); }Spring Boot的Jackson組件會自動把Map序列化成JSON返回給瀏覽器這也是后面寫前后端分離接口的基礎。3.3 啟動項目與訪問驗證回到HelloWebApplication.java找到main方法右鍵點擊運行。第一次啟動時控制臺會刷出一大堆日志不用緊張重點看最后幾行??吹筋愃葡旅娴妮敵鼍驼f明項目已經(jīng)成功啟動Tomcat started on port 8080 (http) Started HelloWebApplication in 2.3 seconds (process running for 2.5)然后在瀏覽器地址欄輸入http://localhost:8080/hello頁面顯示Hello Spring Boot整個鏈路就通了。那一刻你會覺得Spring Boot的自動配置和內置Tomcat真的省掉了大量傳統(tǒng)開發(fā)中部署服務器的繁瑣步驟。如果你不想用8080端口或者8080被別的程序占了可以在application.properties里修改server.port8081 server.servlet.context-path/api改完端口后訪問地址就是http://localhost:8081/api/hello。context-path的意思是給所有接口統(tǒng)一加一個前綴有些團隊規(guī)范會要求這個做前后端分離的時候也常用知道就行。如果在啟動日志里想省掉那個巨大的Spring Boot橫幅可以加一行spring.main.banner-modeoff實測下來能讓日志少刷幾行。不過那個logo看著確實有種儀式感留著也不礙事。4. 常見問題與排查技巧實錄4.1 端口占用一啟動就報錯新手最常見的啟動失敗原因之一就是端口被占用。當你看到日志里出現(xiàn)這樣的內容Web server failed to start. Port 8080 was already in use.說明8080端口已經(jīng)被另一個進程占用了。處理方式有兩種。第一種最簡單直接在配置文件里把端口改掉比如改8081。第二種找出占用端口的進程并結束它Windows下用netstat -ano | findstr 8080查看PID然后在任務管理器里結束對應進程macOS或Linux用lsof -i:8080查看再根據(jù)PID執(zhí)行 kill。我自己的習慣是開發(fā)一個項目就固定一個端口寫在筆記里不要每次都隨機改。比如用戶模塊項目用8090訂單模塊項目用8091這樣同時啟動多個項目調試時不會打架。4.2 接口404組件掃描不到項目能啟動但訪問/hello時出現(xiàn)Spring Boot默認的Whitelabel Error Page或者返回404十有八九是Controller沒有被掃描到。優(yōu)先級最高的檢查點Controller所在的包是不是啟動類所在包的子包。打個比方啟動類的包是com.example.helloweb那Controller可以放在com.example.helloweb.controller或者更深的任何子包。但如果建成了com.example.controllerSpring的默認掃描規(guī)則覆蓋不到接口就是404。還有一個容易踩的坑Controller方法上的請求路徑寫錯了。路徑是大小寫敏感的/Hello和/hello完全不同。第一遍寫接口建議啟動后直接用瀏覽器訪問把路徑對照好再繼續(xù)。4.3 依賴下載慢或卡在解析階段國內開發(fā)者基本都會遇到Maven下載依賴慢的問題表現(xiàn)就是IDEA右下角一直轉圈或者Maven工具窗口里持續(xù)報Downloading...。根據(jù)搜索結果里的高頻問題很多人還遇到“springboot版本太高”同時配著依賴拉不下來的情況這通常不是版本問題而是網(wǎng)絡問題。解決思路就兩條一是換鏡像源用我之前寫的settings.xml配置阿里云鏡像二是不用IDEA內置Maven手動安裝一個Maven在conf/settings.xml里配置鏡像然后在IDEA的Maven設置里指定這個安裝目錄。常見現(xiàn)象和處理辦法現(xiàn)象可能原因處理方式一直卡在Resolving中央倉庫訪問慢配置阿里云鏡像報PKIX path building failedSSL證書校驗問題更新JDK或換鏡像地址報Connect reset網(wǎng)絡不穩(wěn)定換網(wǎng)絡或換鏡像后刷新依賴下到一半失敗網(wǎng)絡波動刪除本地倉庫對應目錄重新導入刷新改完配置后不要忘了在IDEA右側Maven工具窗口里點一下刷新按鈕重新加載項目依賴。4.4 Spring Boot版本太高導致編譯失敗有關“springboot版本太高”的搜索量一直不小多數(shù)情況是版本和JDK不匹配。如果你在編譯時報錯信息里有invalid source release、Unsupported class file major version這些字樣基本就是JDK版本過舊帶不動新版本Spring Boot。舉個例子本機JDK是8卻在pom.xml里把Spring Boot版本配置成了3.3.x那項目啟動時就會報版本不支持的錯誤。解決辦法是反向選擇JDK 8 對應 Spring Boot 2.7.xJDK 17 及以上再用 Spring Boot 3.x。另外還要檢查IDEA里的Project Structure確保Project SDK和Language level與pom.xml里聲明的Java版本一致。有時候pom.xml寫的Java 17但IDEA里Project SDK選的還是JDK 8編譯同樣過不去。養(yǎng)成習慣開啟項目第一件事檢查右下角或Project Structure里SDK對不對。4.5 社區(qū)版相關的一些“花式提示”用社區(qū)版開發(fā)可能會遇到幾個和IDE本身或者調試工具相關的奇怪提示新手容易慌。第一類項目里如果添加了Spring Boot DevTools依賴啟動時可能看到類似“dsh web authentication required; reopen the url printed by dsh web.”這樣一段提示甚至自動彈出一個本地調試視圖。這個提示本身并不代表項目啟動失敗它是開發(fā)工具在啟用熱重啟、監(jiān)控文件變化時給出的輔助信息。判斷項目是否成功就看有沒有Started這行關鍵日志。如果你覺得它太干擾第一遍學習直接刪掉DevTools依賴后續(xù)再研究熱部署。第二類在IDE內嵌瀏覽器或調試面板里看到“加載 web 視圖時出錯: error: could not register service worker”之類的提示。這通常和瀏覽器端的Service Worker注冊有關屬于本地WebView或緩存問題不影響Spring Boot后端接口的正常返回。處理方式很簡單刷新頁面、清理瀏覽器站點數(shù)據(jù)或者切換到自己常用的Chrome訪問接口就行。第三類引入Lombok后代碼里寫Data但getter/setter找不到。這是社區(qū)版里常見的插件坑。打開Settings - Plugins搜索Lombok并安裝然后在Settings里的Build Tools下找到Annotation Processors勾選Enable annotation processing。做完兩步后重新編譯問題基本就能解決。4.6 中文亂碼與編碼問題開發(fā)時最惱人的問題之一就是中文亂碼控制臺打印中文變亂碼或者接口返回中文亂碼。解決思路是先統(tǒng)一編碼。打開Settings - Editor - File Encodings把Global Encoding、Project Encoding、Default encoding for properties files全部設為UTF-8。然后在application.properties里顯式聲明server.servlet.encoding.charsetUTF-8 server.servlet.encoding.enabledtrue server.servlet.encoding.forcetrue這樣設置之后HTTP請求和響應的編碼都會被強制為UTF-8接口返回中文基本不會再亂。控制臺如果還亂碼可以考慮在IDEA安裝目錄的vmoptions文件里加一行-Dfile.encodingUTF-8然后重啟IDEA。不過這個文件要小心修改改之前先備份。我個人在實際操作中的體會是多數(shù)編碼問題都是項目創(chuàng)建時默認編碼沒設對導致源文件本身就不是UTF-8存儲。所以從新建項目一開始就統(tǒng)一UTF-8后面能省掉很多麻煩。第一次做Spring Boot Web項目沒必要急著往里面塞各種依賴和技術棧。先把“用社區(qū)版創(chuàng)建項目 - 導入IDEA - 寫一個接口 - 瀏覽器訪問成功”這條鏈路跑通建立正向反饋再逐步加數(shù)據(jù)庫、加MyBatis、加Redis、加攔截器。等以后項目多了你會發(fā)現(xiàn)start.spring.io生成的骨架里pom.xml和目錄結構都是標準化模板完全可以攢一個自己常用的模板pom下次新建項目直接改坐標能比從零配Maven快得多。