IDEA创建Maven项⽬做JavaWeb时⽆WEB-INFclasses的问题
昨天开始学习Java Web中的Servlet,学到⽤IntelliJ IDEA创建Java Web项⽬时,跟着课程上⽼师的步骤⼀步步做,却发现运⾏时Servlet不到。坑爹的是,练习建项⽬时,⼀模⼀样的操作过程,⾛了⼏遍,有的没问题,有的有问题。
创建项⽬的过程:
1. 新建Maven项⽬,不使⽤任何Archetype
2. 创建⽬录:<;项⽬根⽬录>/src/main/webapp/媒体查询常用尺寸
3. 在Project Structure的Modules中添加Web
4. 将Deployment Descriptors和Web Resource Directories的项都做到<;项⽬根⽬录>/src/main/webapp/
telnet怎么输入命令5. 点击⾃动提⽰的“Create Artifact”⾃动创建⼀个Artifact(类型:Web Application: Exploded)
6. 在Run/Debug Configuration中添加Tomcat Server,其中添加上⾯的Artifact,能正常启动
7. 在<;项⽬根⽬录>/src/main/webapp/添加HTML⽂件、JSP⽂件等,都能正常访问
windows错误恢复无法开机8. 在<;项⽬根⽬录>/src/main/中编写Servlet,不能访问,报ClassNotFoundException
flutter gridview观察Java Web的输出⽬录<;项⽬根⽬录>/out/artifacts/xxx_Web_exploded/可以发现,WEB-INF/⽬录下根本没有classes/⽬录,那么当然不到Servlet。此外,对⽐没出问题的项⽬,可以发现连Maven的输出⽬录<;项⽬根⽬录>/target/都没有。⼿动mvn compile,此时target/⽬录才会⽣成,但即使在此基础上再做rebuild Artifact,其中的.class⽂件也不会复制到WEB-INF/中。
idea配置artifacts所以问题的直接原因很明了,就是IDE根本就没有做Servlet的编译和字节码⽂件复制。
在IDE中的操作过程都是⼀样的,所以盯着界⾯了半天也没到什么不同。最终,通过使⽤VSCode直接⼀⼀diff正常项⽬和问题项⽬⽂件的办法,到了出问题的地⽅——IDEA项⽬的.iml⽂件。
在项⽬的.iml⽂件中,有这么⼀段:
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
将这⼀段删除,再重启Tomcat,发现target/⽬录和WEB-INF/classes/⽬录马上就都有了,此时程序运⾏就⼀切正常了。
struts2表单标签我暂时没去专门查资料搞清这⼀段到底是什么含义,具体是什么机制导致了上⾯的现象,有知道的朋友可以留⾔说⼀下。