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目錄下的文件,能夠被外部訪問到,如何去做?