前言
在本章,會分為分模塊開發、依賴管理、聚合和繼承、屬性、多環境配置和應用、私服幾個模塊,完成本文的學習,將學會團隊內部是如何使用模塊開發,如何解決團隊內部的資源共享與資源同步問題。
文章目錄
- 前言
- 1. 分模塊開發
- (1) 分模塊開發意義
- (2) 快速實現
- 2. 依賴管理
- (1) 依賴傳遞與依賴衝突
- (2) 可選依賴與排除依賴
- 3.聚合和繼承
- (1) 聚合
- <1> **概念**
- <2> 聚合工程開發
- (2) 繼承
- <1> 概念
- <2> 繼承實現
- (3) 聚合和繼承的區別
- 4. 屬性
- <1> 使用方法
- <2> 配置文件加載屬性
- <3> 其他屬性
- <4> 版本管理
- 5. 多環境配置與應用
- (1) 多環境開發
- <1> 簡介
- <2> 使用方式
- (2) 跳過測試(瞭解)
- <1> 通過IDEA工具實現跳過測試
- <2> 通過配置插件實現跳過測試
- <3> 通過命令行跳過測試
- 6. 私服
- <1> 簡介
- <2> 倉庫分類
- <3> 本地倉庫訪問私服配置
- <4> 私服資源上傳與下載
1. 分模塊開發
(1) 分模塊開發意義
將原始模塊按照功能拆分成若干個子模塊,方便模塊間的互相調用,接口共享,例如將各層拆分成對立的模塊,這樣項目每一層都可以單獨維護,方便別人使用。
(2) 快速實現
1.創建Maven模塊
2.書寫模塊代碼(分模塊開發需要現針對模塊功能進行設計,再進行編碼。不會先將工程開發完畢,然後進行拆分)
3.通過Maven指令安裝模塊到本地倉庫(install指令)
在團隊內部開發需要發佈模塊功能到團隊內部可共享的倉庫中(私服)
2. 依賴管理
依賴指當前項目需要的jar包,一個項目可以設置多個依賴
格式:
<!--設置當前項目所依賴的所有jar-->
<dependencies>
<!--設置具體的依賴-->
<dependency>
<!--依賴所屬羣組id-->
<groupId>org.springframework</groupId>
<!--依賴所屬項目id-->
<artifactId>spring-webmvc</artifactId>
<!--依賴版本號-->
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
(1) 依賴傳遞與依賴衝突
依賴傳遞
在項目依賴的jar包中,如果含有>,説明這個jar包還依賴其他的jar包
以上都稱為依賴,對於不同的依賴有以下名稱
- 直接依賴:在當前項目中通過依賴配置建立的依賴關係
- 間接依賴:被資源的資源如果依賴其他資源,當前項目間接依賴其他資源
若有間接依賴的資源和直接依賴的資源相同時,去除直接依賴也可以使用,這個特性就是依賴傳遞。
依賴衝突
由於有了依賴傳遞的存在,難免會導致依賴衝突,依賴衝突就是項目所依賴的某個jar包,有不同的版本,從而導致類包版本衝突。
衝突問題分為三種
- 路徑優先:當依賴中出現相同的資源時,層級越深,優先級越低,層級越淺,優先級越高。
- 聲明優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠後的
- 特殊優先:當同級配置了相同資源的不同版本,後配置的覆蓋先配置的
(2) 可選依賴與排除依賴
可選依賴
隱藏當前工程所依賴的資源,隱藏後不具有依賴傳遞
可選依賴指對外隱藏當前所依賴的資源–不透明
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--可選依賴是隱藏當前工程所依賴的資源,隱藏後對應資源將不具有依賴傳遞-->
<optional>true</optional>
</dependency>
排除依賴
當別的項目依賴這個項目時,將不會依賴這個資源
排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本–不需要
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依賴是隱藏當前資源對應的依賴關係-->
<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>
排除依賴資源僅指定GA,無需指定V
3.聚合和繼承
(1) 聚合
快速構建多模塊開發
<1> 概念
聚合:將多個模塊組織成一個整體,同時進行項目構建的過程稱為聚合
聚合工程:通常是一個不具有業務功能的"空"工程(有且只有一個pom文件)
作用:使用聚合工程可以將多個工程編組,通過對聚合工程進行構建,實現對所包含的模塊進行同步構建
- 當工程中某個模塊發生更新時,必須保障工程中與已更新模塊的關聯的模塊同步更新,此時可以使用聚合工程來解決批量模塊同步構建的問題
通過聚合,避免了我們項目多的時候,改動需要對所有模塊重新編譯的問題
<2> 聚合工程開發
1.創建Maven項目,設置打包類型為pom
<packaging>pom</packaging>
每個maven工程有對應的打包方式,默認為jar,web工程為war
2.設置當前聚合工程所包含的子模塊名稱
<!--設置管理的模塊名稱-->
<modules>
<module>../maven_02_ssm</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
聚合工程中所包含的模塊在進行構建時會根據模塊間的依賴關係設置構建順序,與聚合工程中模塊的配置書寫位置無關
參與聚合的工程無法向上感知是否參與聚合,只能向下配置哪些模塊參與本工程的聚合
(2) 繼承
<1> 概念
繼承描述的是兩個工程間的關係,與java相似,子工程繼承父工程的配置信息,常見於依賴關係的繼承.
作用:快速配置依賴,統一依賴版本(減少版本衝突)
<2> 繼承實現
1.創建Maven項目,設置打包類型為pom
<packaging>pom</packaging>
2.在父工程的pom文件中配置依賴關係(子工程將沿用父工程的依賴關係)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
3.配置子工程中可選的依賴關係
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.在子工程中配置當前工程所繼承的父工程
<!--配置當前工程繼承自parent工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<!--設置父項目pom.xml位置路徑-->
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
5.在子工程中配置使用父工程中可選依賴的座標
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
子工程中使用父工程中的可選依賴時,僅需要提供羣組id和項目id,無需提供版本,版本由父工程統一提供,避免版本衝突
子工程中還可以定義父工程中沒有定義的依賴關係
(3) 聚合和繼承的區別
作用:
- 聚合用於快速構建項目
- 繼承用於快速配置
相同點:
- 聚合與繼承的pom.xml文件打包方式均為pom,可以將兩種關係製作到同一個pom文件中
- 聚合與繼承均屬於設計型模塊,並無實際的模塊內容
不同點:
- 聚合是在當前模塊中配置關係,聚合可以感知到參與聚合的模塊有哪些
- 繼承是在子模塊中配置關係,父模塊無法感知哪些子模塊繼承了自己
4. 屬性
如果需要更新多個jar包,可能會出現漏改導致出現問題.
類似java基礎的變量,在其他的地方使用變量即可.
<1> 使用方法
1.父工程定義屬性
<!-- 設置屬性 -->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>
2.子工程引用屬性
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<2> 配置文件加載屬性
將properties抽取到父工程,之後只需要更新父工程即可
1.定義屬性
<!--定義自定義屬性-->
<properties>
<jdbc.url>1.3.0</jdbc.url>
</properties>
2.配置文件中引用屬性
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=root
3.開啓資源文件目錄加載屬性的過濾器
為了能讓配置文件解析到${}
<build>
<resources>
<!--
${project.basedir}: 當前項目所在目錄,子項目繼承了父項目,
相當於所有的子項目都添加了資源目錄的過濾
-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
注:這個屬性在其他屬性會寫
4.配置maven打war包時,忽略web.xml檢查
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<3> 其他屬性
<4> 版本管理
在jar包的版本定義中,有兩個工程版本用的比較多(瞭解即可):
- SNAPSHOT(快照版本)
- 項目開發過程中臨時輸出的版本,稱為快照版本
- 快照版本會隨着開發的進展不斷更新
- RELEASE(發佈版本)
- 項目開發到一定階段里程碑後,向團隊外部發布較為穩定的版本,這種版本所對應的構件文件是穩定的
- 即便進行功能的後續開發,也不會改變當前發佈版本內容,這種版本稱為發佈版本
除了上面的工程版本,我們還經常能看到一些發佈版本:
- alpha版:內測版,bug多不穩定內部版本不斷添加新功能
- beta版:公測版,不穩定(比alpha穩定些),bug相對較多不斷添加新功能
- 純數字版
5. 多環境配置與應用
(1) 多環境開發
<1> 簡介
在項目中,我們在開發環境開發,測試人員在測試環境開發,項目部署到生產環境上線使用,這三個環境不可能使用同一個數據庫.
而在maven中,提供了多種環境的設定,幫助開發者使用過程中快速切換環境
<2> 使用方式
1.定義多環境
<!--定義多環境-->
<profiles>
<!--定義具體的環境:開發環境-->
<profile>
<!--定義環境中唯一名稱-->
<id>env_dev</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<!--設定是否為默認啓動環境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--測試環境-->
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
2.使用多環境(構建過程)
mvn 指令 -P 環境定義ID[環境定義中獲取]
範例:
mvn install -P env_test
(2) 跳過測試(瞭解)
在執行install時,會自動執行test.
test的意義是提前發現代碼問題、保障軟件質量,避免有缺陷的代碼流入生產環境.
但是當測試通過後,打包和安裝還需要進行測試.
部分模塊沒有開發完畢,想要快速打包一部分,但是測試環境失敗.
遇到以上的情況,我們需要跳過測試,跳過測試有三種方式
<1> 通過IDEA工具實現跳過測試
當點擊後,test會自動取消
<2> 通過配置插件實現跳過測試
細粒度控制跳過測試
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
<!-- 設置跳過測試-->
<includes>
<!-- 包含指定的測試用例-->
<include>**/User*Test.java</include>
</includes>
<excludes>
<!-- 排除指定的測試用例-->
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>
<3> 通過命令行跳過測試
跳過測試:
mvn 指令 -D skipTests
示例:
mvn install -D skipTests
執行的項目構建指令必須包含測試生命週期,否則不生效.例如執行compile生命週期,不經過test生命週期
6. 私服
在團隊之間的jar管理,我們如果直接使用U盤拷貝,會使得非常混亂,但我們又不能將寫好的項目傳到中央倉庫,這個時候,我們可以選擇自己搭建一個類似於中央倉庫的東西,將內容上傳上去,這種東西就是私服
<1> 簡介
私服是一台獨立的服務器,用於解決團隊內部的資源共享與資源同步問題,這裏使用的是Nexus
<2> 倉庫分類
倉庫分為三大類
宿主倉庫hosted
- 保存無法從中央倉庫獲取的資源
- 自主研發
- 第三方非開源項目,比如Oracle,因為是付費產品,所以中央倉庫沒有
代理倉庫proxy
- 代理遠程倉庫,通過nexus訪問其他公共倉庫,例如中央倉庫
倉庫組group
- 將若干個倉庫組成一個羣組,簡化配置
- 倉庫組不能保存資源,屬於設計型倉庫
<3> 本地倉庫訪問私服配置
我們想通過Maven訪問私服,需要上傳的地址、訪問私服的賬號密碼、下載的地址
以上都需要在Maven的配置文件settings.xml中配置
實現步驟
前置步驟:需要在私服創建snapshot倉庫和release倉庫
1.配置本地Maven對私服的訪問權限
<!-- 配置訪問私服的權限 -->
<server>
<id>Coolipa-release</id>
<username>admin</username>
<password>password</password>
</server>
<server>
<id>Coolipa-snapshot</id>
<username>admin</username>
<password>password</password>
</server>
2.配置私服的訪問路徑
<!-- 私服訪問路徑 -->
<mirrors>
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
如果是練習,請把之前的鏡像地址註釋掉,以免干預正常使用
<4> 私服資源上傳與下載
當某一個工程要上傳的時候
配置位置(工程pom文件)
<!--配置當前工程保存在私服中的具體位置-->
<distributionManagement>
<repository>
<!--和maven/settings.xml中server中的id一致,表示使用該id對應的用户名和密碼-->
<id>Coolipa-release</id>
<!--release版本上傳倉庫的具體地址-->
<url>http://localhost:8081/repository/Coolipa-release/</url>
</repository>
<snapshotRepository>
<!--和maven/settings.xml中server中的id一致,表示使用該id對應的用户名和密碼-->
<id>Coolipa-snapshot</id>
<!--snapshot版本上傳倉庫的具體地址-->
<url>http://localhost:8081/repository/Coolipa-snapshot/</url>
</snapshotRepository>
</distributionManagement>
發佈命令mvn deploy
拓:如果想改變私服訪問中央服務器設置
在Repositories -> maven-central