2020版IDEA建Web项目避坑指南:Maven骨架与Tomcat配置

发布时间:2026/10/22 16:16:18
2020版IDEA建Web项目避坑指南:Maven骨架与Tomcat配置 1. 为什么2020版IDE建Web项目会让不少人卡在第一步2020年那会儿JetBrains家的IntelliJ IDEA做了一次挺大的版本调整最直接的变化就是Ultimate版和Community版的功能边界被拉得更开了。很多从Eclipse或者老版本IDEA转过来的人打开新建项目向导一看发现找不到以前那个熟悉的Java Enterprise或者Web Application选项了当场就懵了。这不是你操作有问题而是2020.1之后的版本把Web相关模块的入口重新组织了一遍同时Community版直接砍掉了对Java EE/Web的官方支持。我自己第一次在2020.2上建Web项目的时候也是翻了好一会儿才摸清楚路径。当时想建一个带Servlet的Maven Web工程结果在New Project里翻来翻去只有Java、Kotlin、Groovy这些压根没有Web的影子。后来才反应过来2020版的Web项目创建逻辑变成了先建普通项目再手动加Web Facet或者干脆走Maven的webapp骨架。这个思路转变是很多人卡住的根本原因。这篇文章主要面向几类人一是刚从Eclipse或MyEclipse迁移过来、习惯了New → Dynamic Web Project这套流程的开发者二是用Community版想跑Web项目但一直报错的同学三是虽然用Ultimate版但被新版向导绕晕的老用户。我会把2020版IDEA建Web项目的几条主流路径都拆开讲清楚包括Maven骨架方式、手动加Facet方式、以及Gradle方式顺带把Tomcat配置、Artifact设置、常见报错这些坑一并填了。需要提前说明的是Community版确实不支持Java Web开发这不是配置问题是功能阉割。如果你用的是Community版要么换Ultimate要么老老实实用Maven命令行加外部Tomcat来跑IDEA只当编辑器用。这一点在2020版之后尤其明显因为官方把Web相关的插件都绑定到Ultimate的授权里了。2. 先搞清楚你的IDEA版本到底能不能建Web项目2.1 Ultimate与Community在Web支持上的真实差异很多人装完IDEA就开始建项目压根没注意自己装的是哪个版本。2020版的启动界面虽然会显示版本信息但如果你是通过Toolbox装的有时候会同时装两个版本打开的时候容易搞混。判断方法很简单打开Help → About看版本号后面有没有Ultimate字样。没有的话就是Community版。Ultimate版内置了Java EE、Spring、Jakarta EE等一整套Web开发支持新建项目时能看到Spring Initializr、Java Enterprise这些选项。Community版则只有Java、Kotlin、Maven、Gradle这些基础项没有Web Facet、没有应用服务器集成、没有JSP支持。我见过不少人用Community版折腾半天最后发现连Tomcat的配置入口都找不到白白浪费时间。功能项Ultimate版Community版Web Facet支持不支持Tomcat/JBoss等应用服务器集成支持不支持JSP/Thymeleaf编辑支持完整无或极弱Spring/Spring Boot向导支持部分支持需插件Java Enterprise项目模板支持无数据库工具完整基础如果你确实只能用Community版也不是完全没辙。可以走纯Maven 外部Tomcat的路子用Maven的webapp骨架建项目打包成war然后手动丢到Tomcat的webapps目录里跑。IDEA只负责写代码和跑Maven命令调试体验会差一些但功能上能跑通。2.2 2020版新建项目向导的入口变化2020.1之后New Project向导的布局做了调整。以前是左边一列项目类型右边配置SDK和模板现在变成了左侧选语言/框架右侧选具体模板。Web项目的入口被藏在了几个不同的地方取决于你想建哪种类型的Web项目。如果你要建传统的Servlet/JSP项目入口是Java Enterprise仅Ultimate。如果要建Spring Boot项目入口是Spring Initializr。如果要建纯Maven的webapp入口是Maven然后在右侧勾选Create from archetype再选maven-archetype-webapp。这三条路径对应三种不同的项目结构后面我会分别展开。有个细节值得注意2020版的向导里Java Enterprise这个选项默认可能不显示需要你在左侧列表里往下滚或者确认Ultimate的Java EE插件已经启用。如果插件被禁用了这个选项会直接消失。检查路径是Settings → Plugins → 搜索Java EE确保它是勾选状态。3. 用Maven webapp骨架建Web项目最通用的一条路3.1 为什么我优先推荐Maven骨架方式在2020版IDEA里建Web项目我一般首选Maven的maven-archetype-webapp骨架。原因有几个第一它不依赖Ultimate版Community版也能用第二生成的项目结构是标准的Maven Web布局src/main/webapp、WEB-INF/web.xml这些目录一次到位第三后续要加Spring MVC或者改成Spring Boot都很方便迁移成本低。相比之下用Java Enterprise模板建出来的项目虽然IDEA会自动帮你配好Facet和Artifact但项目结构和Maven标准布局有时候对不齐尤其是web.xml的位置和版本容易在打包的时候出问题。我踩过一次坑用Java Enterprise模板建的项目web.xml默认是3.1版本但Tomcat 9跑的时候因为servlet-api版本对不上启动直接报错后来还是手动改成4.0才解决。Maven骨架方式的具体操作路径是File → New → Project → 左侧选Maven → 右侧勾选Create from archetype → 在列表里找到org.apache.maven.archetypes:maven-archetype-webapp→ Next → 填GroupId、ArtifactId、Version → 选本地Maven和JDK → Finish。3.2 骨架生成后的目录结构与常见缺失项骨架生成完之后你会看到这样的目录结构项目根目录/ ├── pom.xml └── src/ └── main/ └── webapp/ ├── WEB-INF/ │ └── web.xml └── index.jsp这个结构本身没问题但有几个地方骨架默认给的不够需要手动补第一src/main/java和src/main/resources这两个目录骨架不会自动建。你得右键src/main→ New → Directory手动创建然后右键Mark Directory as → Sources Root / Resources Root。不建的话你写的Servlet类没地方放Maven编译的时候也找不到源码。第二web.xml的版本。骨架默认给的是2.3或者2.4的老版本Servlet 4.0对应的应该是web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 /web-app版本不对的话Tomcat启动时可能报web.xml版本不支持之类的错。这个坑我在Tomcat 9上遇到过好几次改成4.0就没事了。第三pom.xml里默认只有JUnit依赖Servlet API的依赖需要自己加。注意scope要设成provided因为Tomcat本身带了servlet-api打包的时候不能重复打进去否则会冲突dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency3.3 pom.xml里必须补的几个关键配置骨架生成的pom.xml比较简陋除了加Servlet依赖还有几个地方建议补上。首先是打包方式默认是war这个没问题但要确认packagingwar/packaging这行在。其次是编译插件指定JDK版本不然Maven可能用默认的低版本编译导致语法报错build finalNamemywebapp/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target /configuration /plugin /plugins /buildfinalName这个配置挺重要它决定了打出来的war包名字。不配的话默认是artifactId-version.war访问路径会变成/mywebapp-1.0-SNAPSHOT/很别扭。设成mywebapp之后访问路径就是/mywebapp/清爽很多。提示如果你用的是JDK 11或更高版本source和target要相应改成11或17。2020版IDEA对JDK 11的支持已经比较完善但有些老插件可能还有兼容问题建议先用JDK 8跑通再升级。4. 手动给普通Java项目加Web Facet的完整流程4.1 什么情况下需要走手动加Facet这条路有时候你已经有一个现成的Java项目想把它改造成Web项目这时候重新建项目不现实就得手动加Web Facet。或者你用Java Enterprise模板建项目时向导没配好也需要手动补Facet。这条路仅Ultimate版可用Community版在Project Structure里根本看不到Facets这个选项。手动加Facet的核心逻辑是告诉IDEA这个项目是一个Web应用Web资源根目录在哪web.xml在哪然后IDEA才能帮你配置Artifact和部署到Tomcat。缺了FacetIDEA就不认这个项目是Web项目部署的时候会报no artifacts configured。4.2 Project Structure里的Facet配置细节操作路径是File → Project Structure → Facets → 点号 → 选Web。然后会弹出一个配置面板需要填两个路径Web Resource Directory指向src/main/webapp这是你的JSP、HTML、CSS这些静态资源和WEB-INF的根目录。Deployment Descriptor指向src/main/webapp/WEB-INF/web.xml这是部署描述符。这两个路径填错的话后面部署必出问题。我见过有人把Web Resource Directory指到了src/main/resources结果Tomcat启动后访问页面全是404排查了半天才发现是路径指错了。填完之后Facet面板里还会显示一个Web节点下面挂着你的资源目录和web.xml。这时候Facet就算加好了但还没完还得去Artifacts里配置打包输出。4.3 Artifact配置与输出目录的对应关系Artifacts决定了IDEA怎么把你的项目打包部署到Tomcat。路径是Project Structure → Artifacts → 点号 → Web Application: Exploded → From Modules → 选你的模块。配置的时候注意几个点Output directory这是IDEA把编译后的class文件和web资源组装到一起的目录Tomcat实际跑的就是这个目录。默认一般在项目根/out/artifacts/xxx_war_exploded。Output Layout这里要确认WEB-INF/classes下面包含了你的编译输出WEB-INF/lib下面包含了所有依赖jar。如果缺了classesTomcat启动后加载不到你的Servlet类会报ClassNotFoundException。有个常见的坑Artifacts里的Available Elements没有正确添加到Output Layout。比如你新加了一个依赖但没在Artifacts里把它加到lib目录跑起来就报NoClassDefFoundError。解决办法是在Artifacts配置界面把右侧Available Elements里的库双击加到左侧对应的位置。5. Tomcat服务器配置与部署跑通的实操细节5.1 在IDEA里配置Tomcat Local ServerUltimate版可以直接在IDEA里配Tomcat。路径是Run → Edit Configurations → 点号 → Tomcat Server → Local。然后配置几个关键项Server tabApplication server指向你本地Tomcat的安装目录。IDEA会自动识别版本。HTTP port默认8080如果被占用了改成8081。Deployment tab点号 → Artifact → 选你刚才配的war exploded。Application context设成/mywebapp这就是访问路径。配好之后点运行IDEA会启动Tomcat并把你的项目部署上去。控制台看到Artifact mywebapp:war exploded: Deployed successfully就说明部署成功了。注意Tomcat的版本要和Servlet API版本匹配。Tomcat 9对应Servlet 4.0Tomcat 8.5对应Servlet 3.1Tomcat 10对应Jakarta EE 9包名从javax变成jakarta。如果你用Tomcat 10跑javax.servlet的项目会报ClassNotFoundException因为包名对不上。这个坑在2020版IDEA里特别容易踩因为IDEA不会主动提醒你版本匹配问题。5.2 部署后404和500报错的排查顺序部署完访问页面报404排查顺序是这样的先看Application context对不对。如果你设的是/mywebapp访问就得是http://localhost:8080/mywebapp/少一段都404。看web.xml里的welcome-file。默认是index.jsp如果你的首页叫别的名字得改。看Artifact的Output Layout。确认webapp目录下的文件确实被复制到了输出目录。有时候IDEA的增量编译会漏文件Rebuild一下就好。看Tomcat日志。IDEA控制台里Tomcat的日志会显示具体哪个资源没找到。报500的话一般是代码异常。看控制台的stack trace定位到具体的Servlet或JSP行号。常见的有Servlet类没找到Artifact里没加classes、依赖缺失lib里没加jar、web.xml配置错误servlet-mapping的url-pattern写错。5.3 热部署与On Update Action的取舍IDEA的Tomcat配置里有个On Update action选项控制你按CtrlF10时Tomcat的行为。可选的有Update resources、Update classes and resources、Redeploy、Restart server。Update resources只更新JSP、HTML这些静态资源不重启。改JSP的时候用这个最快。Update classes and resources更新Java类和资源但不重启Tomcat。改Servlet方法体的时候用这个但改类结构加方法、改签名可能不生效因为JVM已经加载的类没法热替换。Redeploy重新部署整个应用会重启上下文。改web.xml或者加依赖的时候用。Restart server重启整个Tomcat。改Tomcat配置或者换JDK的时候用。我一般设成Update classes and resources改Servlet的时候大部分情况能热更新省去重启时间。但如果发现改了代码没生效别犹豫直接Redeploy多半是类结构变了热替换失败。6. 从传统Web项目迁移到Spring Boot的衔接思路6.1 什么时候该放弃传统war项目传统Servlet/JSP的war项目在2020年之后其实已经不太主流了。如果你新建项目的目的只是学习Servlet原理那用war没问题。但如果是做实际业务我建议直接上Spring Boot。原因很直接Spring Boot内嵌Tomcat不需要单独装Tomcat不需要配Artifact打包成jar直接java -jar就能跑部署和调试都省事太多。从IDEA 2020版的角度看Spring Initializr的集成已经做得很好了。New Project → Spring Initializr → 选依赖Spring Web、Thymeleaf等→ Finish一个可运行的Web项目就出来了。比配传统war项目快得多。6.2 把现有war项目改造成Spring Boot的步骤如果你已经有一个war项目想改成Spring Boot步骤大致是改pom.xml的parent加上spring-boot-starter-parent版本选2.3.x2020年那会儿的主流版本。加依赖spring-boot-starter-web如果原来用JSP再加tomcat-embed-jasper和jstl。改打包方式从war改成jar如果不需要部署到外部Tomcat的话。加启动类一个带SpringBootApplication的main方法类。迁移web.xml配置Servlet、Filter、Listener这些改成用WebServlet、WebFilter注解或者Spring的Bean配置。调整JSP路径Spring Boot默认不支持JSP放在webapp下需要把JSP挪到src/main/resources/META-INF/resources/WEB-INF/jsp并在application.properties里配spring.mvc.view.prefix和suffix。这个迁移过程里最容易出问题的是JSP的支持。Spring Boot对内嵌Tomcat的JSP支持一直有点别扭需要额外加依赖而且打包成可执行jar后JSP可能访问不到。如果项目里JSP很多建议还是打包成war部署到外部Tomcat别折腾内嵌方式。6.3 2020版IDEA对Spring Boot项目的支持现状2020版IDEA对Spring Boot的支持已经相当成熟了。Spring Initializr向导、application.properties的自动补全、Actuator端点的识别、Spring Bean的依赖图这些都有。Ultimate版还有Spring的专属工具窗口能看到Bean的依赖关系。不过有个小问题2020.1版本的Spring插件有时候会误报Bean注入错误明明代码没问题编辑器里就是标红。遇到这种情况先检查依赖是不是都下全了然后File → Invalidate Caches / Restart一下大部分能解决。如果还不行可能是插件的bug升级到2020.2或更高版本会好一些。7. 几个我实际踩过的坑和对应的解法7.1 Maven骨架下载卡住或失败的处理用maven-archetype-webapp骨架的时候IDEA会去中央仓库下载archetype的描述文件。网络不好的时候会卡在Downloading archetype这一步半天不动。解决办法有两个一是配阿里云的Maven镜像在settings.xml里加mirror idaliyun/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror二是在New Project向导里不要勾选Create from archetype直接建一个普通Maven项目然后手动建webapp目录结构和web.xml。这样跳过archetype下载反而更快。7.2 web.xml版本与Tomcat不匹配的报错前面提过web.xml版本和Tomcat版本不匹配会报错。具体表现是Tomcat启动时控制台输出Parse error in web.xml或者Unsupported version。2020版IDEA用Java Enterprise模板建的项目web.xml默认可能是3.1但如果你配的是Tomcat 9它期望的是4.0。改法就是手动把web.xml的schema和version改成4.0前面给过模板。还有一种情况是web.xml的metadata-complete属性。如果设成trueTomcat会忽略注解配置的Servlet只认web.xml里的。如果你用WebServlet注解但没在web.xml里配又设了metadata-completetrueServlet就注册不上访问404。这个坑挺隐蔽的因为代码看起来完全没问题。7.3 Artifact里classes目录为空的诡异情况有一次我配好Artifact跑Tomcat启动没报错但访问Servlet就500报ClassNotFoundException。去输出目录一看WEB-INF/classes是空的。原因是模块的编译输出路径没配好IDEA编译的class文件跑到了别的地方。解决办法是去Project Structure → Modules → 选模块 → Paths tab确认Output path和Test output path指向的是模块自己的target/classes而不是项目根目录的out。改完之后Rebuild Projectclasses目录就有东西了。7.4 JSP页面修改后不生效的缓存问题改JSP之后刷新浏览器没变化这是Tomcat的JSP缓存导致的。Tomcat会把编译后的JSP Servlet缓存在work目录里。解决办法有几个一是改完JSP后按CtrlF10选Update resources二是去Tomcat配置里勾选On frame deactivation设成Update resources三是直接删掉Tomcat的work目录强制重新编译。我一般用第二种切出IDEA窗口的时候自动更新资源回来刷新浏览器就能看到变化。不过这个只对JSP和静态资源有效Java代码改了还是得Update classes。8. 关于建Web项目这件事我自己的几点体会从2020版IDEA开始JetBrains明显在引导用户往Spring Boot和Maven/Gradle标准项目结构上走传统的Java Enterprise项目模板虽然还在但已经不是主推方向了。我自己的做法是新项目一律用Spring Initializr建需要传统war结构的时候用Maven webapp骨架Java Enterprise模板基本不用了。这样项目结构清晰迁移方便也不容易踩版本不匹配的坑。另外Community版用户如果非要搞Web开发我的建议是别在IDEA里死磕直接用Maven命令行建项目、打包然后外部Tomcat跑。IDEA当代码编辑器用调试的时候远程attach到Tomcat的调试端口。虽然麻烦点但至少能跑通比在Community版里找不存在的Web Facet强。最后说一个细节2020版IDEA的Maven配置里Work offline这个选项别随便勾。勾了之后Maven不会去远程仓库下依赖如果你本地仓库里没有对应的jar构建直接失败。我有一段时间因为网络问题勾了这个后来忘了取消新建项目一直报依赖找不到排查了好久才想起来是这个选项的问题。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询