JDK 8 + Maven + IDEA + Tomcat:2026年这套“老古董”组合,坑比你想的多
原创
逍遥
逍遥
昆仑AI安全实验室
2026年10月28日 00:00
广东
去阅读
2026年了,还在配JDK 8的环境,听起来像在考古。但现实是,大量的存量项目、金融系统、政府项目、以及你面试时被要求“熟悉SSM框架”的岗位,跑的还是这套组合。JetBrains官方文档在2026年8月更新的教程里,依然明确写着 “JDK version 1.8 or later” 是Tomcat集成的先决条件。
问题不在于这套组合“老”,而在于它的每一个组件在2026年都有了新的版本陷阱。IDEA社区版和旗舰版在Web开发上的鸿沟、Tomcat 9和10的包名断层、Maven 3.9对JDK 8的兼容性边界——这些东西,2020年的教程不会告诉你。
这篇文章按真实的搭建顺序走一遍:选型 → JDK 8 → Maven → IDEA + Tomcat → 验证。每一步都告诉你“为什么”,而不只是“怎么做”。
一、选型先决条件:Tomcat 9是JDK 8的最后一道门
在动手之前,先把版本矩阵定死。选错了,后面全是白费功夫。
Tomcat 9及以下支持JDK 8。Tomcat 10及以上需要JDK 11或更高,而且包名从javax.*改成了jakarta.*。这意味着你从Tomcat 9迁移到10,所有import javax.servlet.*的代码全部编译失败。如果你的项目是JDK 8 + Servlet 3.1/4.0,你的天花板就是Tomcat 9。
所以这套组合的最终答案是:JDK 8 + Tomcat 9.0.x + Maven 3.9.x + IDEA(旗舰版或社区版,但社区版有代价) 。
JDK 8本身的选择也有讲究。Oracle JDK 8u202是最后一个免费商用版本,之后的8u211+在商业使用上需要Oracle的许可。OpenJDK 8(如Temurin、Zulu、Amazon Corretto)是更干净的选择,没有许可风险,且与Tomcat 9的兼容性经过长期验证。
二、JDK 8:JAVA_HOME是唯一不能错的东西
JDK 8的安装本身没有任何难度。双击安装程序,选一个不带中文和空格的路径,一路下一步。真正的坑在环境变量。
新建系统变量JAVA_HOME ,值指向JDK的安装根目录(比如D:\\Java\\jdk1.8.0_202),不是bin目录,不是jre目录。这是整个配置中最容易错的一步。JAVA_HOME指向的是JDK的根,Tomcat的catalina.bat、Maven的mvn.cmd、IDEA的SDK检测,全部依赖这个变量去找javac和tools.jar。
然后在Path里添加%JAVA_HOME%\\bin。顺序很重要:如果你机器上还装过JDK 17或21,%JAVA_HOME%\\bin必须排在它们前面,否则命令行敲java -version出来的还是高版本。
验证方式不是看环境变量界面,是打开一个全新的cmd窗口(旧窗口不会加载新变量),执行:
java -versionjavac -versionecho %JAVA_HOME%
java -version输出1.8.0_xxx,javac -version输出javac 1.8.0_xxx,echo %JAVA_HOME%输出你的JDK根目录。三个都对,JDK 8才算配好了。
三、Maven:不配镜像,你会在Downloading上浪费一整天
Maven的安装是解压即用。下载apache-maven-3.9.x-bin.zip,解压到一个无中文、无空格的路径,比如E:\\apache-maven-3.9.12。
和JDK一样,新建MAVEN_HOME指向Maven根目录,Path里添加%MAVEN_HOME%\\bin。验证:mvn -v。如果输出里显示的Java version是1.8,说明Maven正确继承了JAVA_HOME。如果显示的是其他版本,说明你的JAVA_HOME没配对,回到上一步。
Maven真正的配置在conf/settings.xml。 有两件事必须做。
第一,改本地仓库位置。 Maven默认把依赖下载到~/.m2/repository,在Windows上就是C:\\Users\\你的用户名\\.m2\\repository。C盘会被迅速吃满。在settings.xml里找到<localRepository>,取消注释,改到一个空间充足的盘:
<localRepository>E:\\maven-repository</localRepository>
第二,配阿里云镜像。 从Maven中央仓库拉依赖在国内的速度,会让你以为网络断了。在<mirrors>标签内插入:
<mirror> <id>aliyunmaven</id> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>*</mirrorOf></mirror>
<mirrorOf>*</mirrorOf>表示所有远程仓库请求都走阿里云,包括中央仓库、插件仓库和项目pom.xml里声明的其他仓库。如果只写central,插件下载仍然会卡在中央仓库。
还有一个容易被忽略的细节:在settings.xml的<profiles>里锁定编译版本为1.8。否则Maven可能用你系统里更高的JDK来编译项目,产生字节码版本不兼容的错误:
<profile> <id>jdk-1.8</id> true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties></profile>
四、IDEA:社区版和旗舰版在Tomcat上的鸿沟,比价格更大
这是2026年这套组合里最容易让人踩坑的地方。
IDEA社区版(Community)不支持Java EE/Web开发。你打开社区版,右键找不到“Add Framework Support”,Facets里没有“Web”选项,Run/Debug Configurations里没有“Tomcat Server”。JetBrains官方文档也明确写了:“Jakarta EE support is limited in IntelliJ IDEA without the Ultimate subscription”。
这意味着,如果你用社区版,你没法在IDEA内部配置一个本地Tomcat并一键部署war exploded。你有三个选择:
第一,换旗舰版(Ultimate)。学生和教师可以通过JetBrains的教育许可免费使用,开源项目也可以申请。这是最省事的路径。
第二,用社区版 + Smart Tomcat插件。插件能补上一部分功能,但Artifact配置、热部署的体验和旗舰版原生支持有差距。
第三,不配外部Tomcat,用Spring Boot的内置容器。如果你的项目不是必须用外置Tomcat(比如不是传统的SSM war项目),Spring Boot的spring-boot-starter-web自带嵌入式Tomcat,mvn spring-boot:run或直接跑主类就能启动,完全绕开IDEA的Web支持限制。
如果你选了旗舰版,配置流程是标准的两步:告诉IDEA Tomcat在哪,告诉IDEA代码怎么部署过去。
Run → Edit Configurations → + → Tomcat Server → Local。在Application Server里指向Tomcat解压目录,IDEA会自动识别版本。然后在Deployment标签页点+ → Artifact,选择项目名:war exploded。war exploded支持热部署,改完代码不用重启Tomcat就能生效。Application context填/,访问地址就是http://localhost:8080/。
一个关键细节: Tomcat不要下载“Windows Service Installer”版本,要下载Core二进制版(zip/tar.gz) 。Installer版本会把Tomcat注册为系统服务,IDEA在管理这种Tomcat时经常遇到权限问题和服务状态冲突。
五、Tomcat 9:启动只是第一步,AJP端口才是那个“默认坑”
Tomcat 9的解压即用。把apache-tomcat-9.0.x.zip解压到无中文路径,双击bin\\startup.bat,浏览器访问http://localhost:8080看到那只猫,Tomcat就启动了。
但默认配置下的Tomcat 9不是“可用”状态,是“能用但不该直接用”的状态。
第一个坑:AJP端口。conf/server.xml里默认有一行<Connector port=\"8009\" protocol=\"AJP/1.3\" redirectPort=\"8443\" />。AJP协议本身存在CVE-2020-1938(Ghostcat),如果你不通过Apache httpd做反向代理,这个端口没有任何存在的必要。直接注释掉,消除风险。
第二个坑:关闭端口。server.xml里的<Server port=\"8005\" shutdown=\"SHUTDOWN\">,任何能连接到8005端口的人都可以发送“SHUTDOWN”字符串关掉你的Tomcat。生产环境应该改成port=\"-1\"(禁用关闭端口),或者设置一个复杂的shutdown字符串。
第三个坑:JVM内存。 Tomcat默认的JVM堆内存只有几十到一百多MB。现代项目稍微有点并发就会OutOfMemoryError。在bin目录下创建setenv.bat(Windows)或setenv.sh(Linux):
set CATALINA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
-Xms和-Xmx设成一样的值可以避免堆动态扩缩容带来的抖动。Metaspace在JDK 8里替代了永久代,不设上限在大量类加载的场景下会无限膨胀。
六、一条命令验证整条链:从mvn到浏览器
环境配完了,用一条最小的链路验证所有组件是否真的连通。
在任意目录下创建一个pom.xml,packaging设为war,引入javax.servlet-api(provided scope)。写一个最简单的Servlet,用@WebServlet(\"/hello\")注解映射,doGet里resp.getWriter().write(\"JDK8+Maven+Tomcat OK\")。
在项目根目录执行:
mvn clean package
target目录下会生成一个war文件。把这个war丢进Tomcat的webapps/目录,启动Tomcat,访问http://localhost:8080/你的war包名/hello。如果看到那句话,说明JDK 8的编译、Maven的依赖管理、Tomcat的Servlet容器、以及它们之间的版本兼容性,全部工作。
如果你在IDEA旗舰版里配了Tomcat,更简单:Run那个Tomcat配置,IDEA会自动打包并部署war exploded,浏览器直接打开。
写在最后
2026年配JDK 8 + Maven + IDEA + Tomcat,核心认知只有三条:
第一,Tomcat 9是JDK 8的天花板。 别往Tomcat 10上撞,javax到jakarta的包名断层会让你的项目直接编译失败。
第二,IDEA社区版和旗舰版在Web开发上的差距是结构性的。 社区版没有Tomcat集成,不是“配置麻烦”,是“功能不存在”。要么换旗舰版,要么用Spring Boot内置容器绕过去。
第三,Maven不配镜像,等于没配。mirrorOf写central不够,要写*。本地仓库改到非系统盘,别让.m2吃掉你的C盘。
这套组合确实“老”。但它稳定、可控、出了问题有大量的资料可查。先把环境跑通,把那条mvn clean package → war → localhost:8080的链路走一遍。链路通了,你才知道后面出问题是代码的错,还是环境的错。
严正声明
本文所述所有工具和配置方案仅用于合法的软件开发、学习和测试场景。JDK 8已停止公共更新,生产环境应评估升级至受支持的LTS版本;如必须使用JDK 8,请选择OpenJDK发行版并关注安全补丁。Tomcat 9应保持更新至最新小版本,及时修复已披露的安全漏洞。IDEA旗舰版请通过合法渠道获取许可。技术无罪,边界是法律。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论