转自:https://www.cnblogs.com/bityinjd/p/9284378.html
首先是 Modules,如下图所示,最开始生成的 Module 里的 jdwork,并没有把我们新生成的 webapp以及子目录放入里边,这样子的话项目在部署和启动的时候是找不到web.xml这个文件的。与此对应的是,项目目录结构中webapp没有任何标记,跟一般文件夹没区别。
![](https://i-blog.csdnimg.cn/blog_migrate/bdbb1a8cba5a14d27908221f023d27d0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ec6ae69727e143fa84e0e662bc8e75b.png)
就好比我自己的这个项目,staffmanage,其中最外层是一个staffManage普通的文件夹,里面有两个模块,分别为sm_service,sm_web,前者并不是web项目,后者才是web项目
![](https://i-blog.csdnimg.cn/blog_migrate/163a08998724c487b2f9ae32da82d078.png)
再回到第一个例子中,要把jdwork变成web项目,需要我们手动添加,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/5972d51289099b130e6902cc70264d8d.png)
注意修改这两个路径为项目中的真实路径,默认路径可能不对。
![](https://i-blog.csdnimg.cn/blog_migrate/b364f7bb6d7c251fb4b50a1c94c6e1ee.png)
修改过之后再看项目目录,就有变化了,如图,虽然我还不是特别清楚这个有啥用。
好了解决了这个问题,该讨论下一些原理性的东西了。
Facets表述了在Module中使用的各种各样的框架、技术和语言。这些Facets让Intellij IDEA知道怎么对待module内容,并保证与相应的框架和语言保持一致。
Facets表示某个module有的特征,比如web、strtus2、spring、hibernate等;
Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;
这里涉及到 IntelliJ Idea 的一个概念,Facet。如果注意观察的话,应该发现了,它就在 Project Structure 栏目里 Project、Modules、Libraries下面那一个,它的作用就是配置项目框架类支持。
比如我们现在要开发的是一个 web 项目,那就需要 web 相关的 Facet,事实上,如果没有这个配置支持,编译器也不知道这个项目是个 web 项目,也就不会去读取 web.xml 的配置,更无法被 tomcat 这种容器支持。
Facet 是和 Module 紧密结合的,你如果是在 Module 里配置了,那么 Facet 里边也会出现,而如果你先在 Facet 里配置,它会要求你选择 Module,所以结果是一致的。
再就是解释下 Artifacts,它的作用是整合编译后的 java 文件,资源文件等,有不同的整合方式,比如war、jar、war exploded 等,对于 Module 而言,有了 Artifact 就可以部署到 web 容器中了。其中 war 和 war exploded 区别就是后者不压缩,开发时选后者便于看到修改文件后的效果。
谈到 Artifacts,就得说一下几个输出目录的问题,Project 选项里有一个 Project compilerc output 目录,这个是整个 Project 的编译输出目录;Modules 的具体单个 Module 的 Path 选项里有个 Compiler output,可以选择继承 Project 或者自定义输出目录,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4f3d4dd797873375434aaf2de3f4b56b.png)
然后就是 Artifacts 也有一个 Output Directory,这几个的关系是怎样的呢?
![](https://i-blog.csdnimg.cn/blog_migrate/ae50c5e4b822960d072db15c043cd266.png)
前两者的关系好理解,就是一个总体和个体配置的关系。而 Artifacts 里的输出目录是跟容器有关系的,在容器运行的时候,会把前两者中起作用的那个(个体配置优先)的 classes 文件复制到 Artifacts 配置的目录的 WEB-INF下边,然后把 Module 的 Facet 里的资源文件目录复制到 Artifacts 目录里,再就是复制 lib 下的 jar 包到 WEB-INF 下,之后项目就可以启动了。