轉自:https://www.cnblogs.com/bityinjd/p/9284378.html
首先是 Modules,如下圖所示,最開始生成的 Module 里的 jdwork,並沒有把我們新生成的 webapp以及子目錄放入里邊,這樣子的話項目在部署和啟動的時候是找不到web.xml這個文件的。與此對應的是,項目目錄結構中webapp沒有任何標記,跟一般文件夾沒區別。


就好比我自己的這個項目,staffmanage,其中最外層是一個staffManage普通的文件夾,里面有兩個模塊,分別為sm_service,sm_web,前者並不是web項目,后者才是web項目

再回到第一個例子中,要把jdwork變成web項目,需要我們手動添加,如下:

注意修改這兩個路徑為項目中的真實路徑,默認路徑可能不對。

修改過之后再看項目目錄,就有變化了,如圖,雖然我還不是特別清楚這個有啥用。
好了解決了這個問題,該討論下一些原理性的東西了。
Facets表述了在Module中使用的各種各樣的框架、技術和語言。這些Facets讓Intellij IDEA知道怎么對待module內容,並保證與相應的框架和語言保持一致。
Facets表示某個module有的特征,比如web、strtus2、spring、hibernate等;
Artifacts是maven中的一個概念,表示某個module要如何打包,例如war exploded、war、jar、ear等等這種打包形式;
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 或者自定義輸出目錄,如下圖所示:

然后就是 Artifacts 也有一個 Output Directory,這幾個的關系是怎樣的呢?

前兩者的關系好理解,就是一個總體和個體配置的關系。而 Artifacts 里的輸出目錄是跟容器有關系的,在容器運行的時候,會把前兩者中起作用的那個(個體配置優先)的 classes 文件復制到 Artifacts 配置的目錄的 WEB-INF下邊,然后把 Module 的 Facet 里的資源文件目錄復制到 Artifacts 目錄里,再就是復制 lib 下的 jar 包到 WEB-INF 下,之后項目就可以啟動了。
