IDEA專案路徑
普通Java專案
普通Java專案,標準目錄結構src下的路徑就是classpath
類路徑,每次編譯都會將src目錄下新增的類和資原始檔打包進類路徑。
如下圖,類檔案和配置檔案都會被編譯打包進類路徑
maven構建Java專案
maven標準目錄結構:
src
-main
–bin 指令碼庫
–java java原始碼檔案
–resources 資源庫,會自動複製到classes目錄裡
–filters 資源過濾檔案
–assembly 元件的描述配置(如何打包)
–config 配置檔案
–webapp web應用的目錄。WEB-INF、css、js等
-test
–java 單元測試java原始碼檔案
–resources 測試需要用的資源庫
–filters 測試資源過濾庫
-site Site(一些文件)
target
LICENSE.txt Project’s license
README.txt Project’s readme
工程根目錄下就只有src和target兩個目錄,target是有存放專案構建後的檔案和目錄,jar包、war包、編譯的class檔案等。target裡的所有內容都是maven構建的時候生成的。
以上摘自:MAVEN專案標準目錄結構
在IDEA中快速建立一個普通maven專案,選擇maven-archtype-quickstart
一項,就可以建立一個maven管理的Java專案。
可以看到,一個最基本的maven專案有src目錄,並且該目錄下存在main和test兩個目錄。
簡單介紹:
src/man/java
:存放類原始碼,其編譯輸出到target-classes
路徑下。
src/test/java
:存放測試程式碼,其編譯輸出到target-test-classes
路徑下。
如果我新增一個配置檔案在java下,按常理來說原始碼(java目錄下的檔案)路徑下的檔案都會被打包到類路徑下,但是對於maven來說,預設情況下,maven只會按照標準的目錄結構查詢和處理檔案,對於其他檔案不予處理。
如下示例:jdbc.properties
沒有被maven處理
但是如果想要它被編譯輸出到classpath
下,也不是不可以。
解決方案
1、專案中新建一個resources
目錄,在IDEA中必須將其標記為Resources
,resources
是maven專案下的一個標準目錄結構,maven對於resources下的檔案就會將其打包到類路徑下。IDEA中,如果新建的resources
目錄並沒有將其標記為Resources
,儘管同名,但是maven還是依舊不會處理。
2、使用maven-resources-plugin
外掛。
示例一:正常處理
編譯測試,結果如下
注:maven僅僅是將resources
目錄下的檔案打包輸出到target-classes
路徑下,不是將resources
目錄打包到target-classes
。
示例二:違反maven目錄結構約束
修改pom檔案,build
標籤下新增resources
設定
<resources>
<resource>
<!--從此目錄下讀取全部以.properties和.xml開頭的檔案-->
<directory>src/main/java/</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
感興趣的夥伴可以嘗試一下。這種方式你說它不合常規,其實也不這麼絕對,框架採用這種方式居多。比如SSM,如果將Mybatis下的mapper統一和類放在一起,而不是放在resources目錄下(hibernat就是這樣做的),採用上述設定,maven可以將類連通相鄰的配置檔案一起打包進類路徑。
普通web專案
tomcat下標準的web目錄結構形式:
JavaWebApp
web應用上下文,根目錄,根目錄下存放的一般是靜態資原始檔,WEB-INF
目錄,正常開發來說它標準的子目錄結構就是這兩個classes
:類路徑,存放java位元組碼檔案、lib
:存放專案所引用到的第三方jar
庫。並且WEB-INF
目錄下的檔案對外都是不可訪問的,只能通過內部進行處理,有時我們也會把一些不想讓客戶直接訪問到的靜態資源放入到這個目錄下。
在IDEA中,web的專案結構如下,可以看到普通的web專案預設編譯輸出路徑和普通的Java專案編譯輸出路徑其實是相同的,都是將編譯後的位元組碼放到了專案根目錄下的名為out/production
目錄下,這些預設配置做的都挺好的,能夠及時看到編譯後的結果。同樣我們也可以更改這些預設輸出路徑,後面會有演示。
普通的servlet
會用到tomcat幾個jar
,可以在Dependencies
選項卡中將tomcat的執行時的類庫匯入
這裡scope選項為provided
的含義就是該包只在編譯期起作用,不會被打包進war,jar
包由tomcat提供。
我們對專案進行部署,檢視編譯之後的目錄結構是怎麼樣的
以上幾個箭頭和方框僅僅演示了java
檔案編譯打包到WEB-IFN/classes
檔案的過程(在沒有更改編譯輸出和Artifacts皮膚中的Output directory路徑的前提下)。
之前保留了一張Eclipse下web專案完整的對映圖
總結
1、web專案下的原始碼檔案編譯後最終會放入WEB-INF/classes
目錄下
2、web、webapps、webcontent、webroot分別是IDEA和eclipse中對web專案根目錄名稱不同的叫法,本質上都是web專案根目錄,對於Eclipse來說,部署的時候都是將其下的所有檔案部署到webapps目錄下的,對於IDEA,是通過建立tomcat例項,將某個url對映到具體的磁碟路徑上實現專案的釋出。
web、webapps、webcontent、webroot目錄就是web應用的根目錄,我們釋出專案,挑明瞭就是將根目下的檔案打包釋出,那些配置檔案之類的去哪了?看前面的編譯流程,所有的配置檔案都會被打包進類路徑,為類所用,所以說配置檔案最終也會匯聚到web應用根目錄裡面去。
網上對於新建一個web工程有很多介紹,在新建web的過程中,有的會特意的去web下新建classes、lib目錄,並且修改專案編譯輸出目錄?為什麼?不這樣做有影響嗎?
為什麼要新建一個classes還要更改其編譯輸出目錄?
即如圖操作:
一個標準的web目錄結構請看上圖,這樣做的原因就是使其目錄結構更加規範(站在人的視角),但是新建一個classes目錄還沒有完,因為idea是不承認WEB-INF/classes
該路徑是編譯輸出路徑的,必須將上圖橫線部分選中然後瀏覽到具體的目錄才可以,之後idea不會在專案根目錄下新建一個out/production
目錄,而是直接將WEB-INF/classes
作為編譯輸出。像剛開始沒有新建classes目錄,web專案也能正常部署,並且應用根目錄下也存在WEB-INF/classes
這個目錄,其實是強大的編譯器幫我們做了。
maven構建web專案
idea檔案圖示介紹
下面以一個maven管理下的標準web專案作為示例:
maven管理下,java和resources目錄下的檔案都會被打包編譯到target-classes
,也就是我們常說的類路徑。
對於小藍點表示的資料夾則不屬於maven管理,小藍點表示的資料夾代表web資源所在目錄,外部所訪問到的也就是該目錄下的檔案。
這裡主要介紹web資源目錄即小藍點所在的目錄如何去設定,它和同級別的resources目錄有什麼不同?
對於一個普通的web專案,預設情況下,小藍點自動標識到了web目錄上,如果將其取消會怎麼樣?
這裡夥伴們可以嘗試一下,新建一個普通的web專案,將其小圓點取消掉,具體的做法如下圖
取消掉之後,小藍點消失,index.jsp也沒有被髮布到webapp目錄下,說明Web Reources Directory
設定的目錄下的檔案都會被打包進根目錄(webapp)下,否則即使web目錄下存在許多靜態資原始檔,由於不會被idea打包進去,最終訪問結果404。
這裡還有一個選項是Path Relative to Deployment Root
,這一個路徑規定了讓idea在打包的時候是相對於哪個路徑打包,預設是相對於根路徑,如果我設定為/jsp
,那麼index.jsp在被打包的時候,就會相對於web根目錄下的/jsp
目錄,將index.jsp檔案打入它的目錄下,如果該目錄不存在,idea會自動建立。
Web Reources Directory
的正確配置,可以讓idea自動地將目錄下的資原始檔成功地釋出到webapp目錄下,以便能夠被外部訪問。預設情況下,idea自動將web根目錄即應用部署下的目錄設定為資源路徑,其實我們還可以新增其他的資源路徑,將其他路徑下的檔案釋出到webapp目錄,如下
在webmvc專案根目錄下,新增了一個不合常規的目錄resources並且將其設定為web資源目錄(小藍點),將其打包到web根下的res目錄
編譯輸出的目錄結構如下:
web資源路徑的設定可以在modules或者facets下的web模組設定:
總結:
1)普通的Java專案和web專案src路徑下的java檔案和配置檔案都會被打包到類路徑下。
2)maven管理的Java專案和web專案,resources目錄和java目錄都會被編譯到類路徑下,對於web來說還會有進一步轉化,類路徑下的檔案最終都會存放在web應用根目錄下的WEB-INF/classes
目錄下。
3)idea預設將web應用根目錄作為資源目錄,其下的檔案和資料夾都會打包到根目錄,並部署到tomcat。
4)若webapp目錄下存在resources目錄,它和maven下的resources目錄是不同的,webapp下的resources目錄預設打包到根目錄下,maven下的resources目錄下的檔案打包到類路徑下。
思考:對於SpringBoot專案,如果想讓webapp目錄下的檔案,能夠被外部訪問到,如何去做?