在公司和家用電腦上不同版本的idea做實驗發現過程中會有些不同,遇到過一些問題,也正是這些問題使得自己能更進一步了解項目構建過程中的細節,特別記錄一下。
這個是【溫故知新】 Java web 開發系列編寫過程中發現的。總結性要點在最后邊,中間過程不想看可跳過。
首先是 Modules,如下圖所示,最開始生成的 Module 里的 jdwork,並沒有把我們新生成的 webapp以及子目錄放入里邊,這樣子的話項目在部署和啟動的時候是找不到web.xml這個文件的。與此對應的是,項目目錄結構中webapp沒有任何標記,跟一般文件夾沒區別。


這里需要我們手動添加,解決方法如下:



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

修改過之后再看項目目錄,就有變化了,如圖,雖然我還不是特別清楚這個有啥用。

好了解決了這個問題,該討論下一些原理性的東西了。
這里涉及到 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 下,之后項目就可以啟動了。
