IDEA專案路徑初探

Wonkey發表於2020-10-16

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中必須將其標記為Resourcesresources是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目錄結構形式:

在這裡插入圖片描述

JavaWebAppweb應用上下文,根目錄,根目錄下存放的一般是靜態資原始檔,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目錄下的檔案,能夠被外部訪問到,如何去做?

相關文章