IDEA启动tomcat不报错,tomcat的webapps文件夹没有项目文件,项目的默认URL404
这个问题困扰了我三四天了。
一直搜索寻找idea如何配置tomcat以及部署,全部都是换汤不换药的千篇一律的帖子,完全没有讲为什么,导致我不知道为什么我的tomcat运行明明没报错,明明已经配置了artifacts了,却还是访问不了localhost:8080/networkliterature,完全不明白war和war explode的区别……
自己摸索了半天,想到最初项目之所以能在tomcat上运行,是因为将项目添加到tomcat的webapps目录下,然后加上受到帖子的提示,才知道配置artifacts的war explode时,实际上里面的Output Directory应该设置到tomcat的webapps下的我的工程,而Output Layout就是配置这个路径里面生成的所有文件。这样才能在tomcat的webapps下面生成我们项目的所有东西。正确配置如下:
先把配置完自动生成的文件贴上来看看:
说明:
1、Output directory:我填写本地tomcat的webapps的路径+我的工程名(工程名这个可以随便写,不过访问时这个URL是项目的根目录的一部分,比如我这么写访问时应该是localhost:8080/networkliterature/index.jsp)
2、Output Layout:真正生成到上面Output directory所配置的目录下的所有文件内容,需要包含上图列出的三个内容。刚开始不配置的时候是这样的:
可以看到Output Layout下啥也没有。接着点击红框框起来的那个小按钮手动创建目录WEB-INF、子目录classes,子目录lib。创建好后就是这样的:
两个子文件夹都是空的。然后将右边的Available Elements的元素分别添加进来,这个元素的作用就是列出你可以被添加进生成目录的文件,里面有一堆maven包,有项目中webapps目录下的文件资源,有项目编译输出的class文件。可以右键选择Navigate查看你是否有配置这些,像这样:
比如我点击模块'networkliterature' compile output的Navigate可以看到这个Project Structure自动跳转到Modules,如下图所示:
这个模块我之前已经配置好输出文件的路径(即class文件的路径,maven项目得配置到“项目\target\classes”和"项目\target\test-classes"下了,而不能配置到out下)。其实模块'networkliterature' compile output的意思就是找到你项目编译后所有生成的class文件,而它正是通过我们配置的输出文件路径去找到所有的class文件。换言之,这里的Modules的输出文件路径配置对了,这个元素就能被我们拿来使用。
所以我们把这个元素模块'networkliterature' compile output拖到classes文件夹下,像这样:
同理,我们将Available Element里面所有maven帮我们下载好的jar包拖到lib目录下(可以一个个拖,也可以全选右键“Put into /WEB-INF/lib”),像这样:
lib搞定之后还差最后一个Web相关资源。直接将右边的Web facet resources拖到WEB-INF的目录下,如下图所示:
可以看到是有点问题的,我们需要手动修改,将‘webapp’ directory contents放到根目录的WEB-INF下,这时会有一个提示如下图所示,不理它就是删。
点击yes后就是这样了(自动删除了WEB-INF和下面的文件web.xml):
这样就配置完成了。
不过有一点要注意,这个‘webapp’ directory contents是我们在项目里配置的webapps文件夹下的东西,里面就是放各种jsp等页面资源+web.xml:
本来这里应该得有个WEB-INF,不过因为我们配置war explode时就是手动将WEB-INF创建出来,所以这里只需要放各种页面资源+web.xml。
这里位置就配置完了,运行启动tomcat之后,可以看到在tomcat的webapps下面看到生成的文件,上面已经贴过一遍了,这次再贴一遍:
稍微说明一下:中间那张图可以看到,它多帮我们生成了一个文件夹META-INF,里面有个MANIFEST.MF文件,这是它自动帮我们生成的,我们不需要手动添加。而同样是中间那张图,有个index.jsp文件,那个文件是我为了方便测试helloworld程序自己拖进去的,上述并且没有配置这个文件。实际开发那些jsp文件都放在WEB-INF里面即可,无需理会这个。
URL访问“localhost:8080/networkliterature/index.jsp”,可以看到访问成功了:
终于……困扰我三四天的bug……解决了7_7
总结:
一直没办法解决这个Bug,首先是产生这个Bug的原因可能有很多,其次网上找的帖子都是只有表象没有实质,都不明白为什么。实在找不到解决办法的时候,就从最本质的分析出发:比如我这里一直访问不到tomcat的我的这个项目,那么可以用排除法,能访问到tomcat其他项目吗?比如tomcat自带的项目examples吗?一般访问项目的时候都是localhost:8080/项目名,比如:
可以看到是可以访问的,而且tomcat也没报错,说明是项目的部署出了问题。在网上找了很多部署的文章都不能解决我的问题后,我开始思考脱离IDE最本质的部署到tomcat的方法是什么?然后看到tomcat自带项目的examples的目录结构,模仿着将artifact配置了出来。怎么模仿的,就是一边试着将右边的Available Element元素拖过来试,一边看生成的文件是否正确,试了四五遍之后就摸索出来了,当然其中也有借鉴一些帖子。
很久没有遇到这种棘手的bug了,感觉归根到底还是对tomcat的部署本质,IDEA的部署本质了解的不够透彻。所以以后得花时间看看IDEA给的官方文档,以及巩固下JDK的基础知识。路漫漫其修远兮,慢慢来吧。