1. 一套能跑起来的 Java 环境到底要装哪几样我最早入行那会儿装环境这件事全靠同事一句一句喂JDK 装了三遍Tomcat 起来了但浏览器打不开Maven 拉依赖拉了一晚上还是红叉。后来带新人带得多了发现大家卡住的地方其实高度重合——不是不会点下一步而是不知道这几个东西各自在管什么、谁依赖谁、哪个先装哪个后装。所以这篇东西我打算按真实搭一套本地开发环境的过程来写JDK、Tomcat、Maven、MySQL 四件套加上 IDEA 作为开发工具把它们串起来。目标很明确——在一台干净的机器上从零开始装到能新建一个 Web 项目、能跑起来、能连上数据库、能正常拉依赖。适合刚接触 Java Web 的同学也适合换电脑、重装系统之后想快速把环境复原的老手当作清单来对。先把这四个东西的分工说清楚后面所有操作都围绕这张职责表来理解组件一句话定位装它解决什么问题JDKJava 代码的运行与编译底座没有它java、javac 命令根本不存在TomcatServlet 容器Web 项目的运行场地让写好的 Web 应用能被浏览器访问Maven项目构建与依赖管理工具统一管理 jar 包、编译、打包、生命周期MySQL关系型数据库让项目有地方存业务数据我的习惯是安装顺序固定为 JDK → Maven → Tomcat → MySQL最后装 IDEA 并逐个关联。理由是 JDK 是后面所有东西的前置Maven 和 Tomcat 都依赖它MySQL 相对独立放最后不影响别的IDEA 放最后是因为它需要去找前面几个的安装路径先有目标再有指向配置一次就顺。2. JDK 安装与 JAVA_HOME 配置90% 的报错都出在这一步2.1 选哪个版本别在这上面纠结太久现在主流选择是 JDK 8、JDK 11、JDK 17、JDK 21 这几个 LTS 版本。我的建议是按你团队或者你要跑的框架来定老项目、维护类系统大量还在 JDK 8 上Spring Boot 2.x 默认基线是 JDK 8而 Spring Boot 3.x 已经把最低要求提到了 JDK 17。如果完全没有历史包袱直接上 JDK 17 或 JDK 21省得以后升级再折腾一轮。选择发行版的时候注意 Oracle JDK 在商用场景有授权问题公司项目里更常见的是 Eclipse Temurin、Amazon Corretto、Microsoft Build of OpenJDK 这类开放版本功能上没有区别授权更清爽。下的时候只认官网别去搜某某镜像站下压缩包来源不明的东西风险太高不值当。安装包分两类.exe安装版和.zip免安装版。装 JDK 我强烈建议用免安装 zip 版解压到类似D:\dev\jdk-17这种纯英文、无空格、无中文的路径下就完事。理由有两个一是卸载干净删文件夹就行注册表和系统目录不留垃圾二是将来要同时装两个 JDK 版本时切换只需改环境变量不需要动安装程序。注意安装路径里千万不要出现中文和空格。Program Files 这个空格就足够让某些老版本的构建脚本解析失败更别说中文路径了。这是那种平时看不出来、出问题时排查到怀疑人生的坑。2.2 环境变量的正确配法Windows 上右键此电脑→ 属性 → 高级系统设置 → 环境变量在系统变量里操作不要配在用户变量里否则换用户登录或某些服务启动的场景会找不到新建JAVA_HOME值填 JDK 的根目录比如D:\dev\jdk-17。注意是根目录不是 bin 目录这是最高频的错误。编辑Path新增一条%JAVA_HOME%\bin。用变量引用而不是写死绝对路径的好处是以后换 JDK 版本只要改JAVA_HOME一处。CLASSPATH现在基本不用配了。老教程里会让你配.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar那是 JDK 8 之前的遗留习惯从 JDK 9 开始模块化之后这些路径已经不存在照着配反而引入无意义条目。配完之后有个动作必须做关掉所有已打开的 cmd 和 IDEA 窗口重新开一个。环境变量是进程启动时读取的已经开着的窗口读的还是旧值很多人改完验证不通过就是卡在这。2.3 验证失败的几种典型情况打开新的命令行依次执行java -version javac -version echo %JAVA_HOME%三个都要有正常输出。如果java能跑但javac提示不是内部或外部命令说明 Path 里加的是 JRE 路径而不是 JDK 的 bin或者只加了%JAVA_HOME%\bin但JAVA_HOME本身是空的。如果java -version输出的版本跟你刚装的不一致那就是机器上还残留着别的 Java或者Path里存在顺序更靠前的旧条目。Windows 的 Path 是按顺序从上往下找的谁在前面谁生效。这时候把新加的条目上移到最前面或者干脆把旧的那条删掉。还有一种情况是JAVA_HOME末尾多带了分号或者值里带了引号。分号会让拼接出来的路径变成D:\dev\jdk-17;\bin引号会被当作路径的一部分。这两个都看不见但都会让命令失效配的时候眼睛盯着点。3. Tomcat 装完起不来八成是端口和 JDK 的问题3.1 解压、目录结构与它到底是什么Tomcat 同样建议用 zip 免安装版解压到D:\dev\tomcat-9.0.x这种目录。解压完先花两分钟认清目录后面调配置全靠它bin启动脚本所在。startup.bat是启动shutdown.bat是关闭catalina.bat是底层脚本调试时更常用它。conf配置文件。server.xml管端口和连接器web.xml是全局部署描述context.xml管上下文logging.properties管日志编码。webapps默认的应用部署目录扔进去的 war 包或者文件夹会自动被加载。logs日志输出目录出问题第一时间来这里翻catalina.out或者localhost.log。lib容器自身运行需要的 jar不要把你项目的依赖扔这里这是个经典误区。启动前先确认一件事Tomcat 自己也是 Java 写的它靠JAVA_HOME找 JDK。所以必须先装好 JDK 并且环境变量正确否则双击startup.bat会一闪而过或者直接报JRE_HOME environment variable is not defined correctly。这就是为什么安装顺序上 JDK 必须在前面。3.2 启动、端口冲突与中文乱码双击bin\startup.bat会弹出一个窗口正常的话最后几行能看到类似 Server startup in xxx ms 的字样。这个窗口不要关关掉服务就停了。然后浏览器访问http://localhost:8080能看到 Tomcat 的默认欢迎页就说明容器本身没问题。起不来最常见的原因是 8080 端口被占用。查是谁占的netstat -ano | findstr :8080最后一列是进程 PID拿它去任务管理器里对一下或者tasklist | findstr PID看进程名。确认可以杀掉就杀不想动它就改 Tomcat 端口——打开conf\server.xml找到Connector port8080 ...这一行改成 8090 之类重启即可。改完记得访问地址也跟着换。第二个高频问题是控制台中文乱码日志里全是问号或者方块。原因是 Windows 控制台默认编码和logging.properties里配的不一致。打开conf\logging.properties把这几个 handler 的 encoding 改成 GBKjava.util.logging.ConsoleHandler.encoding GBK如果不想动容器配置也可以在bin\catalina.bat里给JAVA_OPTS加上-Dfile.encodingUTF-8然后把控制台编码切到 UTF-8chcp 65001。两种方案挑一个就行别两个一起上容易互相打架。3.3 在 IDEA 里把 Tomcat 配成运行环境如果你用的是社区版 IDEA它是没有内置 Tomcat 集成的那套配置界面的这一点要先说清楚社区版更适合做纯 Java SE 或者用内嵌容器的 Spring Boot 项目。旗舰版才有完整的 Application Server 配置面板。旗舰版的配置路径是Run→Edit Configurations→ 左上角→ 找到Tomcat Server→Local。第一次进去Application server那一栏是空的点后面的Configure把 Tomcat 的解压目录指过去。指对了之后下面的JRE一般会自动带出来如果没有就手动选你装的那个 JDK。接下来切到Deployment标签页点→Artifact选带war exploded后缀的那个。这里有个关键概念要说透war模式是把项目打成压缩包再部署war exploded是直接把编译输出目录映射过去改完代码不用重新打包就能生效一部分资源。开发阶段一律用 exploded只有要验证最终打包结果时才用 war。最下面那行Application context我一般改成/这样访问根路径就行省得每次输一长串前缀。改完点 OK点绿色三角启动。IDEA 底部会开一个服务面板日志、重启、停止都在那儿比在命令行窗口里操作舒服得多。提醒如果项目编译报 Package javax.servlet does not exist先看你的 Tomcat 是不是 10 及以上版本。Tomcat 10 开始把 Servlet API 的包名从javax.*换成了jakarta.*老项目在 Tomcat 10 上跑不起来换回 Tomcat 9 是最省事的解法别急着全项目改包名。4. Maven 是干嘛的配置不对依赖能下一整晚4.1 它解决的核心痛点在 Maven 之前项目依赖的 jar 包是靠人工下载然后往WEB-INF/lib里拷的。麻烦在哪A 依赖 BB 又依赖 C你得自己顺着关系一个个找版本冲突了没人告诉你换台机器要重新拷一遍打包、编译、测试各写一套脚本。Maven 把这些统一了用pom.xml声明依赖它自动去仓库下载并处理传递依赖编译、测试、打包、安装、部署都有一套标准生命周期换台机器只要 pom 在一条命令全搞定。我建议把 Maven 装成独立的免安装版而不是依赖 IDEA 自带的那个 bundled 版本。理由是自己装的那个版本可控、路径清晰命令行和 IDE 用的是同一套不会出现命令行能跑 IDE 报错这种精神分裂的情况。版本上选 3.8.x 或 3.9.x 都行注意 3.8.1 之后默认会拦截 HTTP 协议的仓库所以镜像地址必须用 HTTPS 的。4.2 安装与环境变量解压到D:\dev\apache-maven-3.9.x然后新建系统变量MAVEN_HOME值为解压根目录。Path里新增%MAVEN_HOME%\bin。新开命令行执行mvn -v能看到 Maven 版本、Java 版本、系统信息三行输出就成功了。mvn -v这里还能顺便验证一件事输出里的 Java version 是不是你预期的那个 JDK。如果显示的是别的版本回头查JAVA_HOME。4.3 settings.xml 怎么改本地仓库与镜像Maven 装完不做任何配置也能用但默认的本地仓库在用户目录下的.m2\repository里C 盘紧张的同学迟早要炸。打开conf\settings.xml在settings标签内加localRepositoryD:\dev\maven-repo/localRepository第二个必改项是镜像。默认从中央仓库拉国内访问速度很感人配个国内镜像能把首次构建时间从几十分钟压到几分钟mirrors mirror idaliyun-public/id mirrorOfcentral/mirrorOf namealiyun public/name urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrorsmirrorOf写central表示接管中央仓库的请求。如果你还想让项目里自定义的其他仓库也走镜像可以写成*但这会把所有仓库都劫持过来某些私有仓库场景下会出问题按需选择。第三个是可选项但很有用在profiles里锁定编译用的 JDK 版本避免项目里 pom 没指定时用了一个意料之外的版本profile idjdk-17/id activation activeByDefaulttrue/activeByDefault jdk17/jdk /activation properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target maven.compiler.compilerVersion17/maven.compiler.compilerVersion /properties /profile4.4 IDEA 里关联 Maven别让它在后台偷偷重下File→Settings→Build, Execution, Deployment→Build Tools→Maven。三个地方要动Maven home path选你自己装的 Maven 目录不要选 Bundled。User settings file勾上Override指向conf\settings.xml。Local repository正常情况下会自动读出来如果没读出来检查 settings 文件路径是不是选错了。改完新建一个项目试试。观察 IDEA 底部有没有在弹依赖下载的进度看下载地址是不是走的国内镜像域名——如果不是说明 settings 没生效多半是Override没勾上IDEA 还在用自己的那份配置。这里踩过的坑值得说一句IDEA 里有个Work offline勾选项一旦勾上就不再联网请求仓库只从本地找。有时候明明刚清了缓存想重新拉怎么点都没反应就是它开着。另一个是mvn命令行的-U参数强制检查快照更新遇到依赖明明更新了却拉不到新的加这个参数试试。5. MySQL 装好不代表能用初始化和认证方式才是重点5.1 安装包版本与安装方式选择MySQL 8.0 是现在的默认选择8.4 也在逐步普及。下的时候认准官网的 Community 版本免费的。两种装法我都用过说下各自的适用场景MSI 安装版有图形向导一步步点会自动帮你配好服务、端口、root 密码适合完全不想碰命令行的人代价是它会往系统里装一堆东西卸载时如果残留清理不干净重装会出各种奇怪问题。ZIP 免安装版需要手动初始化但过程完全透明出问题知道去哪查我个人一直用这种。ZIP 版解压到D:\dev\mysql-8.0.x。注意这个目录后面会被当成basedir路径里别带中文空格。5.2 初始化配置my.ini 怎么写在解压根目录下新建my.ini内容大致这样[mysqld] basedirD:/dev/mysql-8.0.x datadirD:/dev/mysql-8.0.x/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_general_ci default_authentication_pluginmysql_native_password max_connections200 [client] port3306 default-character-setutf8mb4几个点解释一下。datadir指向的目录一开始是不存在的初始化命令会创建它。utf8mb4才是真正完整的 UTF-8老的utf8在 MySQL 里实际只有 3 字节存 emoji 或者某些生僻字会报错新项目一律用utf8mb4。default_authentication_plugin这行是给老版本客户端和旧驱动留的兼容口子MySQL 8 默认用caching_sha2_password一些老版本的连接器不认识它会报认证失败设成mysql_native_password能少一堆麻烦。配完打开管理员命令行切到 bin 目录执行初始化mysqld --initialize-insecure --console--initialize-insecure表示初始化时不设 root 密码方便第一次进。如果省略insecure它会生成一个随机临时密码写进日志文件还得去翻日志麻烦。初始化成功的话data目录里会冒出很多文件。然后注册服务并启动mysqld --install mysql80 net start mysql80服务名可以自己起我一般带上版本号将来装第二个版本时不冲突。5.3 设密码、改认证、配环境变量启动之后登录mysql -u root因为没设密码直接回车。进去之后立刻改密码ALTER USER rootlocalhost IDENTIFIED BY 你的密码; FLUSH PRIVILEGES;如果之前那个认证插件配置没生效可以在这里单独为账号指定ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;顺手把 MySQL 的 bin 目录加到Path里这样以后在任何目录都能直接敲mysql命令。新建系统变量MYSQL_HOME指向解压目录Path加%MYSQL_HOME%\bin重开命令行验证mysql --version。5.4 IDEA 里连数据库那几个报错怎么灭IDEA 右侧有个 Database 面板社区版可能需要装插件或者用其他方式连。新建数据源选 MySQL填主机localhost、端口3306、用户名root、密码数据库名可以先空着点Test Connection。第一次点大概率会提示缺少驱动点一下让它自动下载就行。如果公司网络下不下来去 Maven 中央仓库手动下mysql-connector-j的 jar在驱动配置里手动指定文件。连不上的几种典型报错我列个速查表报错信息原因解决方式Access denied for user rootlocalhost密码错或账号不允许从该主机登录确认密码必要时用 skip-grant-tables 方式重置Public Key Retrieval is not allowed驱动用了 sha2 认证但没允许取公钥连接串加allowPublicKeyRetrievaltrueThe server time zone value is unrecognized服务端时区和驱动解析不一致连接串加serverTimezoneAsia/ShanghaiCommunications link failure服务没起、端口不通、防火墙拦截先net start确认服务再telnet localhost 3306测端口连接串的常见完整写法是jdbc:mysql://localhost:3306/你的库名?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse是本地开发关掉加密连接省掉证书配置的麻烦生产环境不要这么写。Spring Boot 项目里这几个参数就写在application.yml的spring.datasource.url里本质是一样的。6. 版本搭配和排查顺序能省掉一半折腾时间6.1 版本对应关系先看这张表再动手环境搭不起来很大一部分原因是版本互相不认。这张表是我实际验证过的常见组合JDKTomcatMavenMySQL适用场景88.5 / 93.65.7 / 8.0老项目维护、Spring Boot 2.x1193.88.0过渡期项目1710.13.98.0 / 8.4新项目、Spring Boot 3.x2110.1 / 113.98.4追求新特性几个硬规则记住就行Tomcat 10 及以上必须 JDK 11Tomcat 11 要求更高Spring Boot 3.x 必须 JDK 17Spring Boot 3 项目如果用外置 Tomcat只能用 Tomcat 10 及以上因为 jakarta 包名这件事。6.2 排查要按顺序别东一榔头西一棒子出问题时我习惯按这个顺序走能快速缩小范围第一步java -version和mvn -v。这两个是地基地基不稳后面全白搭。如果 Maven 输出的 Java 版本不对先修JAVA_HOME。第二步单独测 Tomcat。不看项目直接双击startup.bat访问 8080。能出欢迎页说明容器没问题问题在项目出不来就是容器或端口的问题。第三步单独测数据库。命令行mysql -u root -p能进去说明服务正常问题在连接配置进不去就是服务、密码或认证方式的问题。第四步回到 IDEA 里看配置。Project Structure 里的 SDK 和 Language level、Modules 里的依赖、Run Configuration 里的 Artifact这三处是项目跑不起来的高发区。第五步看具体的报错日志。IDEA 底部的控制台会把异常栈打出来从最底部的Caused by往上读第一行往往不是根因最下面那个由...引起才是。这个习惯能帮你省掉大量瞎猜的时间。6.3 我踩过的几个具体坑第一个是编码问题。项目里 properties 文件读出来中文变乱码除了文件本身编码要设成 UTF-8还得在 IDEA 的Settings→Editor→File Encodings里勾上Transparent native-to-ascii conversion这个选项会把 properties 文件里的非 ASCII 字符自动转成 Unicode 转义从根上避免乱码。第二个是 Maven 依赖下载了一半失败之后无论怎么点都拉不下来。这是因为失败的依赖会在本地仓库留下.lastUpdated后缀的标记文件Maven 认为它拉过了就跳过。解决办法是去本地仓库找到对应目录把带.lastUpdated的文件删掉或者直接加-U参数强制更新。第三个是 IDEA 改了settings.xml之后不生效。IDEA 会缓存 Maven 的配置改完记得在 Maven 面板点一下刷新按钮或者File→Invalidate Caches清一下缓存。第四个是装完 MySQL 之后忘了它有个服务开机自启后来本机装了另一个版本两个服务抢 3306 端口其中一个永远起不来。查端口占用的时候才发现的用netstat -ano | findstr :3306一看 PID 对不上。所以同一台机器上我一般不装第二个 MySQL 实例真需要就在my.ini里换端口。6.4 关于 IDEA 版本与授权的说明IDEA 分社区版和旗舰版。社区版免费长期可用做 Java SE、Maven 项目、Spring Boot 项目都没问题缺点是没有内置的 Java EE 和数据库工具那一套整合。旗舰版功能全官方提供 30 天试用学生和教师可以通过官方渠道申请免费教育授权开源项目维护者也有对应的免费方案。走官方渠道就行别去碰来路不明的安装包和所谓激活工具这类东西被植入后门或者挖矿程序的案例不少为了省点钱把开发机搭进去不值得。版本上也不用追最新。IDEA 新版本对 JDK 版本、插件兼容性都有要求我刚升过一次大版本结果常用的格式化插件不兼容回退折腾了半天。稳妥做法是选一个当前主流稳定版用熟了再说真要升级先把插件列表存一份。整套环境装完我的习惯是做一次完整验证新建一个 Maven Web 项目配置好 Tomcat写一个最简单的 Servlet 或者 Controller通过 JDBC 或者连接池读一条数据库记录显示在页面上。这一个流程跑通说明 JDK、Maven、Tomcat、MySQL、IDEA 五个环节全部正确联动之后换机器照着这篇走一遍基本半小时内能复现出一套一模一样的环境。我自己的做法是把settings.xml、my.ini这两个配置文件单独存一份到云盘重装系统时直接覆盖比重头配一遍快得多。