目標(biāo)
- 理解并實(shí)現(xiàn)分模塊開發(fā)
1,分模塊開發(fā)
1.1 分模塊開發(fā)設(shè)計(jì)
(1)按照功能拆分
我們現(xiàn)在的項(xiàng)目都是在一個模塊中,比如前面的SSM整合開發(fā)。雖然這樣做功能也都實(shí)現(xiàn)了,但是也存在了一些問題,我們拿銀行的項(xiàng)目為例來聊聊這個事。
- 網(wǎng)絡(luò)沒有那么發(fā)達(dá)的時候,我們需要到銀行柜臺或者取款機(jī)進(jìn)行業(yè)務(wù)操作
- 隨著互聯(lián)網(wǎng)的發(fā)展,我們有了電腦以后,就可以在網(wǎng)頁上登錄銀行網(wǎng)站使用U盾進(jìn)行業(yè)務(wù)操作
- 再來就是隨著智能手機(jī)的普及,我們只需要用手機(jī)登錄APP就可以進(jìn)行業(yè)務(wù)操作
上面三個場景出現(xiàn)的時間是不相同的,如果非要把三個場景的模塊代碼放入到一個項(xiàng)目,那么當(dāng)其中某一個模塊代碼出現(xiàn)問題,就會導(dǎo)致整個項(xiàng)目無法正常啟動,從而導(dǎo)致銀行的多個業(yè)務(wù)都無法正常班理。所以我們會按照功能將項(xiàng)目進(jìn)行拆分。
(2)按照模塊拆分
比如電商的項(xiàng)目中,有訂單和商品兩個模塊,訂單中需要包含商品的詳細(xì)信息,所以需要商品的模型類,商品模塊也會用到商品的模型類,這個時候如果兩個模塊中都寫模型類,就會出現(xiàn)重復(fù)代碼,后期的維護(hù)成本就比較高。我們就想能不能將它們公共的部分抽取成一個獨(dú)立的模塊,其他模塊要想使用可以像添加第三方j(luò)ar包依賴一樣來使用我們自己抽取的模塊,這樣就解決了代碼重復(fù)的問題,這種拆分方式就說我們所說的按照模塊拆分。
經(jīng)過兩個案例的分析,我們就知道:
- 將原始模塊按照功能拆分成若干個子模塊,方便模塊間的相互調(diào)用,接口共享。
剛剛我們說了可以將domain層進(jìn)行拆分,除了domain層,我們也可以將其他的層也拆成一個個對立的模塊,如:
這樣的話,項(xiàng)目中的每一層都可以單獨(dú)維護(hù),也可以很方便的被別人使用。關(guān)于分模塊開發(fā)的意義,我們就說完了,說了這么多好處,那么該如何實(shí)現(xiàn)呢?
1.2 分模塊開發(fā)實(shí)現(xiàn)
前面我們已經(jīng)完成了SSM整合,接下來,咱們就基于SSM整合的項(xiàng)目來實(shí)現(xiàn)對項(xiàng)目的拆分。
1.2.1 環(huán)境準(zhǔn)備
將資料\maven_02_ssm
部署到IDEA中,將環(huán)境快速準(zhǔn)備好,部署成功后,項(xiàng)目的格式如下:
1.2.2 抽取domain層
步驟1:創(chuàng)建新模塊
創(chuàng)建一個名稱為maven_03_pojo
的jar項(xiàng)目,為什么項(xiàng)目名是從02到03這樣創(chuàng)建,原因后面我們會提到,這塊的名稱可以任意。
步驟2:項(xiàng)目中創(chuàng)建domain包
在maven_03_pojo
項(xiàng)目中創(chuàng)建com.itheima.domain
包,并將maven_02_ssm
中Book類拷貝到該包中
步驟3:刪除原項(xiàng)目中的domain包
刪除后,maven_02_ssm
項(xiàng)目中用到Book
的類中都會有紅色提示,如下:
**說明:**出錯的原因是maven_02_ssm
中已經(jīng)將Book類刪除,所以該項(xiàng)目找不到Book類,所以報(bào)錯
要想解決上述問題,我們需要在maven_02_ssm
中添加maven_03_pojo
的依賴。
步驟4:建立依賴關(guān)系
在maven_02_ssm
項(xiàng)目的pom.xml添加maven_03_pojo
的依賴
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
因?yàn)樘砑恿艘蕾?,所以?code>maven_02_ssm中就已經(jīng)能找到Book類,所以剛才的報(bào)紅提示就會消失。
步驟5:編譯maven_02_ssm
項(xiàng)目
編譯maven_02_ssm
你會在控制臺看到如下錯誤
錯誤信息為:不能解決maven_02_ssm
項(xiàng)目的依賴問題,找不到maven_03_pojo
這個jar包。
為什么找不到呢?
原因是Maven會從本地倉庫找對應(yīng)的jar包,但是本地倉庫又不存在該jar包所以會報(bào)錯。
在IDEA中是有maven_03_pojo
這個項(xiàng)目,所以我們只需要將maven_03_pojo
項(xiàng)目安裝到本地倉庫即可。
步驟6:將項(xiàng)目安裝本地倉庫
將需要被依賴的項(xiàng)目maven_03_pojo
,使用maven的install命令,把其安裝到Maven的本地倉庫中。
安裝成功后,在對應(yīng)的路徑下就看到安裝好的jar包
**說明:**具體安裝在哪里,和你們自己電腦上Maven的本地倉庫配置的位置有關(guān)。
當(dāng)再次執(zhí)行maven_02_ssm
的compile的命令后,就已經(jīng)能夠成功編譯。
1.2.3 抽取Dao層
步驟1:創(chuàng)建新模塊
創(chuàng)建一個名稱為maven_04_dao
的jar項(xiàng)目
步驟2:項(xiàng)目中創(chuàng)建dao包
在maven_04_dao
項(xiàng)目中創(chuàng)建com.itheima.dao
包,并將maven_02_ssm
中BookDao類拷貝到該包中
在maven_04_dao
中會有如下幾個問題需要解決下:
-
項(xiàng)目
maven_04_dao
的BookDao接口中Book類找不到報(bào)錯-
解決方案在
maven_04_dao
項(xiàng)目的pom.xml中添加maven_03_pojo
項(xiàng)目<dependencies> <dependency> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
-
-
項(xiàng)目
maven_04_dao
的BookDao接口中,Mybatis的增刪改查注解報(bào)錯-
解決方案在
maven_04_dao
項(xiàng)目的pom.xml中添加mybatis
的相關(guān)依賴<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>
-
步驟3:刪除原項(xiàng)目中的dao包
刪除Dao包以后,因?yàn)?code>maven_02_ssm中的BookServiceImpl類中有使用到Dao的內(nèi)容,所以需要在maven_02_ssm
的pom.xml添加maven_04_dao
的依賴
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
此時在maven_02_ssm
項(xiàng)目中就已經(jīng)添加了maven_03_pojo
和maven_04_dao
包
再次對maven_02_ssm
項(xiàng)目進(jìn)行編譯,又會報(bào)錯,如下:
和剛才的錯誤原因是一樣的,maven在倉庫中沒有找到maven_04_dao
,所以此時我們只需要將maven_04_dao
安裝到Maven的本地倉庫即可。
步驟4:將項(xiàng)目安裝到本地倉庫
將需要被依賴的項(xiàng)目maven_04_dao
,使用maven的install命令,把其安裝到Maven的本地倉庫中。
安裝成功后,在對應(yīng)的路徑下就看到了安裝好對應(yīng)的jar包
當(dāng)再次執(zhí)行maven_02_ssm
的compile的指令后,就已經(jīng)能夠成功編譯。
1.2.4 運(yùn)行測試并總結(jié)
將抽取后的項(xiàng)目進(jìn)行運(yùn)行,測試之前的增刪改查功能依然能夠使用。
所以對于項(xiàng)目的拆分,大致會有如下幾個步驟:
(1) 創(chuàng)建Maven模塊
(2) 書寫模塊代碼
分模塊開發(fā)需要先針對模塊功能進(jìn)行設(shè)計(jì),再進(jìn)行編碼。不會先將工程開發(fā)完畢,然后進(jìn)行拆分。拆分方式可以按照功能拆也可以按照模塊拆。
(3)通過maven指令安裝模塊到本地倉庫(install 指令)
團(tuán)隊(duì)內(nèi)部開發(fā)需要發(fā)布模塊功能到團(tuán)隊(duì)內(nèi)部可共享的倉庫中(私服),私服我們后面會講解。
2,依賴管理
我們現(xiàn)在已經(jīng)能把項(xiàng)目拆分成一個個獨(dú)立的模塊,當(dāng)在其他項(xiàng)目中想要使用獨(dú)立出來的這些模塊,只需要在其pom.xml使用標(biāo)簽來進(jìn)行jar包的引入即可。
其實(shí)就是依賴,關(guān)于依賴管理里面都涉及哪些內(nèi)容,我們就一個個來學(xué)習(xí)下:
- 依賴傳遞
- 可選依賴
- 排除依賴
我們先來說說什么是依賴:
依賴指當(dāng)前項(xiàng)目運(yùn)行所需的jar,一個項(xiàng)目可以設(shè)置多個依賴。
格式為:
<!--設(shè)置當(dāng)前項(xiàng)目所依賴的所有jar-->
<dependencies>
<!--設(shè)置具體的依賴-->
<dependency>
<!--依賴所屬群組id-->
<groupId>org.springframework</groupId>
<!--依賴所屬項(xiàng)目id-->
<artifactId>spring-webmvc</artifactId>
<!--依賴版本號-->
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
2.1 依賴傳遞與沖突問題
回到我們剛才的項(xiàng)目案例中,打開Maven的面板,你會發(fā)現(xiàn):
在項(xiàng)目所依賴的這些jar包中,有一個比較大的區(qū)別就是有的依賴前面有箭頭>
,有的依賴前面沒有。
那么這個箭頭所代表的含義是什么?
打開前面的箭頭,你會發(fā)現(xiàn)這個jar包下面還包含有其他的jar包
你會發(fā)現(xiàn)有兩個maven_03_pojo
的依賴被加載到Dependencies中,那么maven_04_dao
中的maven_03_pojo
能不能使用呢?
要想驗(yàn)證非常簡單,只需要把maven_02_ssm
項(xiàng)目中pom.xml關(guān)于maven_03_pojo
的依賴注釋或刪除掉
在Dependencies中移除自己所添加maven_03_pojo
依賴后,打開BookServiceImpl的類,你會發(fā)現(xiàn)Book類依然存在,可以被正常使用
這個特性其實(shí)就是我們要講解的依賴傳遞。
依賴是具有傳遞性的:
說明: A代表自己的項(xiàng)目;B,C,D,E,F,G代表的是項(xiàng)目所依賴的jar包;D1和D2 E1和E2代表是相同jar包的不同版本
(1) A依賴了B和C,B和C有分別依賴了其他jar包,所以在A項(xiàng)目中就可以使用上面所有jar包,這就是所說的依賴傳遞
(2) 依賴傳遞有直接依賴和間接依賴
- 相對于A來說,A直接依賴B和C,間接依賴了D1,E1,G,F(xiàn),D2和E2
- 相對于B來說,B直接依賴了D1和E1,間接依賴了G
- 直接依賴和間接依賴是一個相對的概念
(3)因?yàn)橛幸蕾噦鬟f的存在,就會導(dǎo)致jar包在依賴的過程中出現(xiàn)沖突問題,具體什么是沖突?Maven是如何解決沖突的?
這里所說的依賴沖突是指項(xiàng)目依賴的某一個jar包,有多個不同的版本,因而造成類包版本沖突。
情況一: 在maven_02_ssm
的pom.xml中添加兩個不同版本的Junit依賴:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
通過對比,會發(fā)現(xiàn)一個結(jié)論
- 特殊優(yōu)先:當(dāng)同級配置了相同資源的不同版本,后配置的覆蓋先配置的。
情況二: 路徑優(yōu)先:當(dāng)依賴中出現(xiàn)相同的資源時,層級越深,優(yōu)先級越低,層級越淺,優(yōu)先級越高
- A通過B間接依賴到E1
- A通過C間接依賴到E2
- A就會間接依賴到E1和E2,Maven會按照層級來選擇,E1是2度,E2是3度,所以最終會選擇E1
情況三: 聲明優(yōu)先:當(dāng)資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠后的
- A通過B間接依賴到D1
- A通過C間接依賴到D2
- D1和D2都是兩度,這個時候就不能按照層級來選擇,需要按照聲明來,誰先聲明用誰,也就是說B在C之前聲明,這個時候使用的是D1,反之則為D2
但是對應(yīng)上面這些結(jié)果,大家不需要刻意去記它。因?yàn)椴还躆aven怎么選,最終的結(jié)果都會在Maven的Dependencies
面板中展示出來,展示的是哪個版本,也就是說它選擇的就是哪個版本,如:
如果想更全面的查看Maven中各個坐標(biāo)的依賴關(guān)系,可以點(diǎn)擊Maven面板中的show Dependencies
在這個視圖中就能很明顯的展示出jar包之間的相互依賴關(guān)系。
2.2 可選依賴和排除依賴
依賴傳遞介紹完以后,我們來思考一個問題,
- maven_02_ssm 依賴了 maven_04_dao
- maven_04_dao 依賴了 maven_03_pojo
- 因?yàn)楝F(xiàn)在有依賴傳遞,所以maven_02_ssm能夠使用到maven_03_pojo的內(nèi)容
- 如果說現(xiàn)在不想讓maven_02_ssm依賴到maven_03_pojo,有哪些解決方案?
**說明:**在真實(shí)使用的過程中,maven_02_ssm中是需要用到maven_03_pojo的,我們這里只是用這個例子描述我們的需求。因?yàn)橛袝r候,maven_04_dao出于某些因素的考慮,就是不想讓別人使用自己所依賴的maven_03_pojo。
方案一:可選依賴
- 可選依賴指對外隱藏當(dāng)前所依賴的資源—不透明
在maven_04_dao
的pom.xml,在引入maven_03_pojo
的時候,添加optional
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--可選依賴是隱藏當(dāng)前工程所依賴的資源,隱藏后對應(yīng)資源將不具有依賴傳遞-->
<optional>true</optional>
</dependency>
此時BookServiceImpl就已經(jīng)報(bào)錯了,說明由于maven_04_dao將maven_03_pojo設(shè)置成可選依賴,導(dǎo)致maven_02_ssm無法引用到maven_03_pojo中的內(nèi)容,導(dǎo)致Book類找不到。
方案二:排除依賴
- 排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本—不需要
前面我們已經(jīng)通過可選依賴實(shí)現(xiàn)了阻斷maven_03_pojo的依賴傳遞,對于排除依賴,則指的是已經(jīng)有依賴的事實(shí),也就是說maven_02_ssm項(xiàng)目中已經(jīng)通過依賴傳遞用到了maven_03_pojo,此時我們需要做的是將其進(jìn)行排除,所以接下來需要修改maven_02_ssm的pom.xml
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依賴是隱藏當(dāng)前資源對應(yīng)的依賴關(guān)系-->
<exclusions>
<exclusion>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
</exclusion>
</exclusions>
</dependency>
這樣操作后,BookServiceImpl中的Book類一樣也會報(bào)錯。
當(dāng)然exclusions
標(biāo)簽帶s
說明我們是可以依次排除多個依賴到的jar包,比如maven_04_dao中有依賴junit和mybatis,我們也可以一并將其排除。
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依賴是隱藏當(dāng)前資源對應(yīng)的依賴關(guān)系-->
<exclusions>
<exclusion>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
介紹我這兩種方式后,簡單來梳理下,就是
-
A依賴B,B依賴C
,C
通過依賴傳遞會被A
使用到,現(xiàn)在要想辦法讓A
不去依賴C
- 可選依賴是在B上設(shè)置
<optional>
,A
不知道有C
的存在, - 排除依賴是在A上設(shè)置
<exclusions>
,A
知道有C
的存在,主動將其排除掉。
學(xué)習(xí)筆記 from 黑馬程序員文章來源:http://www.zghlxwxcb.cn/news/detail-405866.html
By – Suki 2023/4/6文章來源地址http://www.zghlxwxcb.cn/news/detail-405866.html
到了這里,關(guān)于Maven高級-分模塊開發(fā)&依賴管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!