新闻详情

新闻详情

首页 / 资讯中心 / 详情

Maven搭建SpringBoot Web项目:从零到一的完整实战教程

发布时间:2026/10/1 3:20:44来源:尧图网络
Maven搭建SpringBoot Web项目:从零到一的完整实战教程
1. 项目概述为什么每个Java Web项目都绕不开Maven搭SpringBoot搞Java开发的同学应该都有过这种体验打开IDE想新建一个Web项目结果光是把环境搞通就花了一下午。JDK版本对不上、Maven下载依赖卡在中央仓库半天不动、SpringBoot版本太高导致启动直接报错……这些坑我基本都踩过一遍。这篇内容要聊的就是最基础的“用Maven搭建一个SpringBoot-Web项目”。说白了就是用Maven作为构建工具把SpringBoot框架的Web项目从零到一完整跑起来。它能帮你解决三件最头疼的事依赖管理SpringBoot项目要引入一大堆第三方jar包手写根本不可能。Maven用pom.xml统一管理依赖声明坐标就能自动下载、版本控制、传递依赖解析告别手动拷贝jar包的时代。项目结构规范Java Web开发需要标准的目录结构Maven默认的src/main/java、src/main/resources分层就是行业共识新同事接手项目几乎零成本。一键构建clean、compile、package、install一条命令搞定编译、单元测试、打包、本地安装配合CI/CD流水线非常顺畅。适合谁来参考刚入门SpringBoot的Java后端初学者或者被公司老项目折腾过但没系统梳理过构建流程的同学。哪怕你已经有两年经验回头看这篇也能发现一些细节坑——比如Maven镜像配置不对导致依赖下载慢、SpringBoot 3.x对JDK版本的要求之类的都是平时不踩一次根本不会注意到的点。1.1 SpringBoot、Maven、Web这三者到底是什么关系先理清这三者的关系很多新手把自己的时间浪费在“不知道问题出在哪个环节”上本质就是没分清它们的职责边界。SpringBoot是开发框架它负责把Web应用的核心能力自动装配进来。你做Web项目需要处理HTTP请求、做参数绑定、返回JSON、拦截器、过滤器这些底层能力SpringBoot通过spring-boot-starter-web一个依赖全部搞定还自带内嵌Tomcat不用再单独部署外置容器。Maven是构建工具负责项目全生命周期管理。它按照pom.xml里声明的依赖去中央仓库或镜像仓库下载jar包缓存到本地仓库默认在用户目录下的.m2/repository然后执行编译、测试、打包流程最终产出可运行的jar或war包。Web指项目类型——这是一个对外提供HTTP接口服务的项目而不是命令行工具或者批处理任务。它要处理浏览器请求、RESTful API调用、前后端数据交互。可以类比成开一家餐馆SpringBoot是装修好的店面加招聘好的厨师你只管写菜单Controller接口Maven是食材供应链你列好清单pom.xml它把食材jar包采购回来放进后厨仓库本地仓库Web就是餐馆对外营业的窗口顾客浏览器/客户端通过HTTP协议来点菜发请求厨师做完菜端出去返回响应。三个角色缺一不可。1.2 环境选型JDK、Maven、IDE怎么配才不踩坑第一步不是写代码是先把环境配好。我见过太多人卡在这里项目代码没问题一启动就报错最后发现是JDK版本和SpringBoot版本不匹配。JDK版本选择组合方案说明JDK 8 SpringBoot 2.x老项目最常见兼容性好很多公司的存量系统还在用JDK 11 SpringBoot 2.x可以体验模块化特性、ZGC等新GC但改动不大适合追求稳定的场景JDK 17 SpringBoot 3.x新项目首选SpringBoot 3.x要求Java 17起性能更好长期支持JDK 21 SpringBoot 3.2最新推荐的长期支持版本虚拟线程等特性值得尝试特别提醒如果你拿到的参考项目是早期用SpringBoot 2.x写的千万别直接升级到SpringBoot 3.x。SpringBoot 3.x底层从javax迁移到jakarta命名空间很多框架的API变了不是改个版本号就能跑起来的。Maven版本建议用3.6.3以上最好直接上3.8.x或3.9.x。Maven 3.9对JDK 17、21的兼容性更好而且修了一堆依赖解析的Bug。低于3.6的版本在解析SpringBoot 2.6的依赖树时偶尔会出现奇怪的问题。IDE选择IDEA是目前Java开发的事实标准。2024版IDEA创建项目时直接集成了Spring Initializr选好SpringBoot版本就能一键生成骨架省掉手动建目录的麻烦。不过我还是建议至少手动建一次纯Maven项目彻底理解目录结构是怎么来的之后再怎么依赖工具都不慌。2. Maven仓库与镜像配置先把依赖下载这条路铺好2.1 settings.xml里必须改的三个地方Maven的全局配置在apache-maven-3.x.x/conf/settings.xml用户级配置在~/.m2/settings.xml。用户级配置会覆盖全局配置优先级更高。我建议把配置放到用户级这样IDEA和命令行用的配置一致不会出现“IDEA里能跑命令行里依赖下载失败”的诡异问题。打开settings.xml至少改这三个地方第一个本地仓库位置。默认路径是${user.home}/.m2/repository在C盘系统盘空间紧张的时候会非常难受。改成其他盘localRepositoryD:/maven-repository/localRepository注意路径不能有中文和空格有些公司的安全检查工具会扫描每个仓库目录路径里带空格的坑我踩过一次排查了半天才发现是路径分隔问题。第二个mirror镜像配置。这个决定了你从哪下载依赖是最关键的一项下一节展开说。第三个profiles里的jdk编译级别。有些公司的构建环境默认JDK版本很老建议固定用maven-compiler-plugin指定source和target而不是依赖环境默认值profile idjdk-17/id activation activeByDefaulttrue/activeByDefault /activation properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target /properties /profile设置完maven.compiler.source和target我一般还会加一行encodingUTF-8/encoding原理是Maven编译时如果用平台默认编码Windows下是GBK源码里的中文注释和字符串会乱码这是一个极其经典的问题。2.2 阿里云镜像为什么能救命以及怎么填格式才不会被坑Maven默认从中央仓库repo.maven.apache.org下载依赖。这个仓库在国外下载速度看网络心情有时候一个几MB的jar包能卡到你怀疑人生。解决办法是配置镜像。国内最有名、最稳定的是阿里云仓库。mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirrormirrorOf配置为*表示所有仓库请求都走这个镜像。阿里云public仓库实际是central和jcenter的聚合覆盖了绝大多数开源依赖。需要说明的是如果你公司有Nexus私服mirrorOf通常写成external:*或者指定仓库ID避免把私服请求也拦截掉这个根据公司规范来。配置完镜像之后依赖下载速度会从几十分钟降到几十秒这是体感最明显的一条优化。实测下来同一个SpringBoot项目不配镜像第一次构建需要下载上百MB依赖慢的话半小时起步配了阿里云镜像两三分钟就能跑完。还有一个小技巧如果某个依赖下载到一半失败了本地仓库会留下.lastUpdated后缀的临时文件。Maven遇到这些文件会认为依赖已经“尝试过”但失败即使修复了网络问题也会一直报错。遇到这种情况手动删掉~/.m2/repository或你配置的本地仓库下对应目录的所有.lastUpdated文件然后重新构建。3. pom.xml搭建SpringBoot项目的“地基”3.1 继承父工程还是用BOM新手最纠结的问题pom.xml是Maven项目的核心SpringBoot项目搭建一半的功夫都在这里。新手最容易纠结SpringBoot官方文档推荐继承spring-boot-starter-parent但很多公司项目用的是BOMBill of Materials方式。两者到底有啥区别方式一继承父工程parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.4/version relativePath/ /parent这种方式最省事。父工程已经帮你配置好了编译插件、资源过滤、maven-compiler-plugin、spring-boot-maven-plugin等子项目只需要写依赖坐标不需要写version父工程统一管理版本。方式二BOM导入当你的项目本身已经有父工程比如公司统一规定的company-parent没法再继承SpringBoot父工程时就用BOM方式dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version3.2.4/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagementdependencyManagement的好处是不影响项目自身的继承关系只管理依赖版本。坏处是自己要在build节点里手动配置spring-boot-maven-plugin签名、repackage这些细节都得自己来。提示能继承父工程就别折腾BOM。除非公司强制要求否则继承方式写起来最少、出问题最少。我见过太多同学为了“技术上的优雅”选了BOM结果打包时忘了配repackage插件打出来的jar包根本不能独立运行。3.2 starter-web到底帮你干了哪些活写Web项目光有SpringBoot核心还不够核心只提供IoC容器和基础能力处理HTTP请求还差得远。所以要在pom.xml里引入dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency这个starter-web是Web项目的核心依赖它内部通过Maven的传递依赖机制自动带上了spring-web和spring-webmvcSpringMVC的HTTP处理能力提供Controller、RequestMapping、RequestBody等注解。tomcat-embed-core等内嵌Tomcat库项目直接以jar方式运行不需要单独装Tomcat。jackson-databindJSON序列化和反序列化前后端数据交互全靠它Controller里返回对象时自动转成JSON。spring-boot-starterSpringBoot的自动配置能力SpringBootApplication注解生效的前提条件。一句话总结加了一个starter-web你就拥有了一个自带Tomcat、SpringMVC、JSON处理的Web服务底座。这种“一个依赖搞定一个领域”的设计是SpringBoot最核心的思想后面的starter-data-jpa、starter-data-redis、starter-security都是同一个套路。感兴趣的同学可以在IDEA右侧的Maven工具窗口点击“Download Sources”再用mvn dependency:tree命令看依赖树你会发现SpringBoot帮你做了多少事情mvn dependency:tree -Dincludesorg.springframework.boot:*这条命令会列出项目里所有SpringBoot相关的传递依赖能直观看到starter-web到底引入了哪些东西。排查依赖冲突时这个命令也是主力工具。4. 目录结构与核心代码从空项目到一个能跑的接口4.1 标准分层目录别嫌麻烦Maven约定优于配置目录结构是固定的。一个标准的SpringBoot Web项目长这样myweb-project ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com/example/myweb │ │ │ ├── MywebApplication.java │ │ │ ├── controller/ │ │ │ ├── service/ │ │ │ ├── mapper/ │ │ │ └── config/ │ │ └── resources │ │ ├── application.yml │ │ ├── banner.txt │ │ └── static/ │ └── test │ └── java └── target/启动类MywebApplication.java必须放在com.example.myweb这个根包下。这不是强迫症而是SpringBootApplication注解默认扫描“当前包及其子包”作为组件扫描范围。如果启动类放错位置扫描不到controller里的Bean接口请求就会404。application.yml是配置文件端口、数据库连接、日志级别、Redis地址都在这里配。默认是application.properties格式但我推荐用application.yml缩进式结构在配置多层级内容时清晰得多。看一眼就能懂server: port: 8080 servlet: context-path: /apicontext-path: /api的意思是所有接口统一加/api前缀。这个配置强烈建议加上后续做网关转发、权限拦截都会省很多事。resources/banner.txt是自定义启动Banner。SpringBoot启动时控制台会打印那个大大的Spring图标如果你想让项目启动时打印点有个性的内容网上搜“SpringBoot banner生成器”在线生成txt图案丢到这个文件里就行。这个纯属锦上添花但团队内部为了识别不同环境可以在banner里打印环境名实测还是很实用的。4.2 启动类和第一个Controller最小可运行单元创建一个最简单的Web接口需要两个文件。启动类package com.example.myweb; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class MywebApplication { public static void main(String[] args) { SpringApplication.run(MywebApplication.class, args); } }Controllerpackage com.example.myweb.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/hello) public class HelloController { GetMapping public String hello() { return Hello, SpringBoot Web!; } }RestController是Controller加ResponseBody的组合注解意思是这个类里所有接口方法的返回值直接写入HTTP响应体等价于输出JSON或纯文本。这样做前后端分离接口非常方便。启动之后浏览器访问http://localhost:8080/api/hello能看到Hello, SpringBoot Web!。到这里一个最小可运行的SpringBoot-Web项目就算搭建完成整个过程不过十几行代码。背后发生了什么启动类执行时SpringBoot的自动配置开始工作内嵌Tomcat在8080端口启动Spring容器扫描到HelloController注册为BeanDispatcherServlet把请求按路径映射到对应方法。这就是“自动配置”的魔法所在——你看不见Tomcat启动过程但它确实在工作。5. 实操过程命令行一键构建到IDEA图形化两条路都走一遍5.1 用IDEA创建SpringBoot项目的完整步骤虽然可以直接在start.spring.io网站下载初始项目但从IDEA里创建是最顺手的。以IDEA 2024版本为例打开IDEA选择New Project。左侧选Spring Initializr右侧设置Name、Group通常是com.example、Artifact、Java Version。关键一步Type选择MavenPackaging选JarJava Version选你本机的JDK版本。点击Next在Dependencies里勾选Spring Web。这就等于帮你把spring-boot-starter-web加进pom.xml了。点击Finish等待首次构建完成。首次构建时间取决于网络和镜像配置。如果前面settings.xml没配镜像这一步下载依赖会非常痛苦配好了一分钟内在IDEA底部能看到“BUILD SUCCESS”。需要注意IDEA 2024版本的Spring Initializr默认选择SpringBoot 3.x如果本机JDK是8创建时要么把Java Version调低但SpringBoot版本变成2.x要么直接升级JDK。这里无关对错只关乎你后续要对接的老系统。手动创建纯Maven项目的方式也可以New Project选Empty Project然后右键项目选择Add Framework Support勾选Maven再手动在pom.xml里添加SpringBoot父工程依赖。这种方式步骤多但能让你真正理解每个配置的来源。第一次建项目我建议两条路都走一遍先手动再工具理解深度完全不同。5.2 打包、运行、验证接口构建产物你到底该看哪几个文件项目建好后运行方式有两种。方式一IDEA直接运行直接运行MywebApplication的main方法控制台会打印SpringBoot启动日志看到“Tomcat started on port 8080”说明启动成功。这种方式适合开发调试。方式二命令行构建运行在项目根目录执行mvn clean install -DskipTestsclean删除target目录install执行编译、测试跳过、打包、安装到本地仓库的全过程。构建完成后target目录下会生成myweb-project-0.0.1-SNAPSHOT.jar这是SpringBoot的可执行jar内部包含依赖的jar包可以直接运行。原始jar包文件名会带.original后缀这是没有经过SpringBoot打包插件的普通jar不能直接java -jar运行不少新手看都不看拿它去部署结果报“没有主清单属性”。运行可执行jarjava -jar target/myweb-project-0.0.1-SNAPSHOT.jar-DskipTests跳过测试但不编译测试代码-Dmaven.test.skiptrue连测试代码都不编译。CI环境两者有讲究本地快速打包用-DskipTests就够了。验证接口是否正常用curl命令最快curl http://localhost:8080/api/hello返回Hello, SpringBoot Web!就是成功。如果你用的是PowerShellcurl可能被系统别名成Invoke-WebRequest行为略有差异建议用curl.exe强制调用原生命令这个小坑我帮好几个同事排查过。6. 常见问题与排查技巧实录6.1 依赖下载慢、jar包损坏、版本冲突这三个问题统称“Maven玄学”实际都有明确的原因和解决路径。依赖下载慢先看镜像配置是否生效。在IDEA终端执行mvn help:effective-settings这条命令会打印实际生效的settings.xml内容如果镜像配置没生效检查是不是写在了mirrors节点外面或者用户级和全局级配置冲突。jar包损坏表现为构建时报奇怪的类找不到、ZipException等。原因多半是之前下载中断本地仓库里有损坏的文件。删掉本地仓库对应目录后重新构建即可。如果你懒想全部重新来直接删整个repository目录代价是下次构建从头下载时间较长。一般推荐精准定位删除。版本冲突先跑依赖树mvn dependency:tree -Dverbose-Dverbose参数会显示依赖冲突的详细版本被选中的原因。看到某个包有多个版本时在pom.xml中显式声明你需要版本或者用exclusions排除掉传递依赖中的不需要版本。举一个实际案例项目同时引入spring-boot-starter-web和一个老版本的commons-io结果某个类路径上同时出现了两个版本的commons-io运行时报NoSuchMethodError。用dependency:tree定位后在引入老依赖的starter里加exclusions剔除即可。6.2 端口冲突、版本太高导致的启动失败端口冲突很好判断启动日志里报Port 8080 was already in use。解决方式改配置server.port改成8081等其他空闲端口。杀进程Windows下netstat -ano | findstr :8080查到PIDtaskkill /F /PID 端口号结束进程。这个命令在公司Windows服务器上非常常用比打开任务管理器一个个找快得多。SpringBoot版本太高的坑多且隐蔽。最常见的是JDK版本过低SpringBoot 3.x在JDK 8环境启动直接报UnsupportedClassVersionError。排查时先确认当前java -version和pom.xml里的Java版本是否匹配。还有一类是SpringBoot 3.x下路径匹配策略变了默认不再支持AntPathMatcher改为PathPatternParser。如果你用拦截器写通配符路径如/api/**写法没变但行为可能不同导致拦截器不生效。排查这类问题要看启动日志的RequestMappingHandlerMapping匹配信息以及拦截器注册方式。6.3 我踩过的几个坑小细节让你抓狂这几个坑每一条都是我实际碰到过的列出来给大家当避雷针。坑一环境变量PATH没生效。命令行执行mvn -v提示“不是内部或外部命令”。原因多半是配置M2_HOME和PATH后没有重启命令行窗口或者配置的路径解析到Maven安装目录下没有bin目录。Windows下配置后执行where mvn可以验证。坑二IDEA里能跑命令行里跑不了。IDEA内置了一个Maven和命令行装的Maven不是同一个。IDEA里的Maven版本、settings.xml路径、本地仓库路径都可能和命令行不同。建议在IDEA的Settings - Build Tools - Maven里指定本机的Maven home path和用户级settings.xml统一版本否则会出现“IDEA里构建成功Jenkins或命令行构建失败”的问题。坑三中文乱码。日志中文乱码是编码配置问题。Windows下IDEA的Help - Edit Custom VM Options加一行-Dfile.encodingUTF-8pom.xml里设置project.build.sourceEncoding为UTF-8两者配合基本能根治。坑四开发阶段想看某个依赖类源码。特别是怀疑SpringBoot版本太高导致某些类行为变化时可以用反编译工具查看jar包里的class文件确认。IDEA自带反编译功能在Maven工具窗口的Dependencies里双击某个jar自动反编译出源码。排查接口行为异常的时候我经常这么干比百度搜索结果可靠得多。坑五内嵌Tomcat下JSP支持弱。如果你的老项目用了JSP迁移到SpringBoot内嵌Tomcat会遇到页面无法解析的问题。SpringBoot官方对JSP的支持是“能用但不推荐”需要额外加tomcat-embed-jasper依赖而且打包成jar后JSP可能完全不可用。新项目千万别碰JSP直接静态页面加RestAPI前后端分离才是主流。7. 一点自己的收尾建议从第一次手动建Maven项目到现在我用SpringBoot搭过的Web项目没有二十个也有十五个了。个人最大的体会是初期多花十分钟把settings.xml和pom.xml理解透比后期反复排查依赖问题要值得多。尤其是本地仓库位置、镜像配置、编译编码这三项建议新建项目时第一时间确认后面几乎不会再碰构建问题。最后再分享一个我常用的习惯每次建完项目我会先在pom.xml里加上spring-boot-starter-actuator依赖开发阶段用上线前去掉然后访问/actuator/health接口快速确认服务的健康状态。这个接口在排查“项目启动了但接口访问不了”时特别有用几秒钟就能判断到底是服务压根没起来还是路由映射有问题。如果你第一次走完全流程还有哪一步不明白最好的办法就是照着这篇的内容重新建一个空项目把每一步手动敲一遍。踩坑的过程才是真正学会的过程。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STM32开发参考方案选型指南:硬件验证+代码质量+平台对比 2026/10/1 4:25:40

STM32开发参考方案选型指南:硬件验证+代码质量+平台对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
集成平台运行时架构设计:服务治理、组件生命周期与高可用实践 2026/10/1 4:25:34

集成平台运行时架构设计:服务治理、组件生命周期与高可用实践

做集成平台这几年,我最大的感触是:方案文档里的架构图画得再漂亮,真正决定平台好坏的一定是运行时这一层。启动、初始化、装配,这些一次性动作做得好只能说明设计合理;而服务在线上跑起来之后,流量一进来&a…

阅读更多 →
单相MMC整流控制与电容电压均衡:从原理到工程实践 2026/10/1 4:25:34

单相MMC整流控制与电容电压均衡:从原理到工程实践

1. 单相MMC从哪里来,为什么值得当验证平台第一次看到MMC(模块化多电平换流器)这个缩写,大多数人是在三相柔性直流输电的论文里。那会儿我心里想的也是:高压大容量、几百个子模块、上百千伏电压等级,这玩意儿…

阅读更多 →
都市供求信息网源码拆解:从跑通到改动的Java Web实战 2026/10/1 4:25:34

都市供求信息网源码拆解:从跑通到改动的Java Web实战

简介:这是一套面向Java Web初学者与课程设计者的都市供求信息网项目源码,采用前后台分离设计,适合用于毕业设计、课程实训或自学练手。前台覆盖信息列表展示、分类浏览、详情查看、定位搜索与模糊搜索以及信息发布;后台则实现信息…

阅读更多 →
Proteus 8.4安装教程:从避坑到破解汉化全流程详解 2026/10/1 4:25:34

Proteus 8.4安装教程:从避坑到破解汉化全流程详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
miniconda+清华源:pip与conda换源配置全攻略 2026/10/1 4:25:34

miniconda+清华源:pip与conda换源配置全攻略

1. 项目概述1.1 这个项目要解决什么问题先说说我为什么想写这个话题。做Python开发的人,特别是刚入门的朋友,大概率都经历过这样的场景:装个OpenCV,pip install opencv-python敲下去,然后就是漫长的等待,进…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉