一. pom.xml文件
1.1 簡介
pom:project object model 項目對象模型
pom.xml是Maven的核心配置文件
一個Maven項目有且只有一個pom.xml文件,該文件必須在項目的根目錄下
1.2 坐標
1.2.1 什么是坐標
(1)用來唯一的標識每個標識,必須為項目定義坐標,坐標必須唯一
(2)目的是為了讓其他Maven項目可以使用該項目生成的jar包
1.2.2 坐標詳解
Maven坐標是通過一些元素來定義:groupId、artifactId、version
1 <! 2 坐標: 3 groupId:組織Id,表示當着模塊所隸屬的項目 4 artifactId:模塊id 5 version:當前的版本 6 > 7 <groupId>com.wfz.study</groupId> 8 <artifactId>maven01</artifactId> 9 <version>1.0SNAPSHOT</version>
1.3 依賴
1.3.1 基本配置
如何查找一個jar包的坐標?
http://search.maven.org/ 或 http://mvnrepository.com/ 或http://maven.aliyun.com/nexus/#
1.3.2 如何查找一個坐標
<dependency> <groupId>mysql</groupId> <artifactId>mysqlconnectorjava</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>commonsfileupload</groupId> <artifactId>commonsfileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency
1.3.3 scope作用域
表示依賴的作用域,用來配置依賴的jar包可使用的范圍
取值 | 含義 | 舉例 |
compile |
該依賴可以在整個項目中使用,參與打包部署,默認值 | commonsfileupload |
test |
該依賴只能在測試代碼中使用,不參與打包部署 | junit |
provided |
該依賴編寫源代碼時需要,不參與打包部署 | servletapi、jspapi |
runtime |
該依賴編寫代碼時不需要,運行時需要,參與打包部署 | mysqlconnector |
system |
表示使用本地系統路徑下的jar包,需要和systemPath一起使用 ojdbc.jar | ojdbc.jar |
1.3.4 properties
全局屬性,一般情況下用於定義全局的jar包版本
<properties> <project.build.sourceEncoding>UTF8</project.build.sourceEncoding> <fileupload.version>1.3.1</fileupload.version> <junit.version>4.12</junit.version> <mysqlconnectorjava.version>5.1.38</mysqlconnectorjava.version> <spring.version>4.3.12.RELEASE</spring.version> </properties> <dependencies> <! junit > <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies>
1.3.5 repositories
用來配置當前工程使用的遠程倉庫
依賴查找順序:本地倉庫——>當前工程pom.xml中配置的遠程倉庫——>setting.xml中配置的遠程倉庫
<! 配置遠程倉庫 > <repositories> <! 有些最新的jar包,可能在中央倉庫上並沒有提供,此時可以使用jar包官方提供的倉庫 > <repository> <id>spring_repo</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <! mavencleanplugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mavencleanplugin</artifactId> <version>2.6.1</version> </plugin> <! tomcat插件 > <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7mavenplugin</artifactId> <version>2.2</version> <configuration> <path>/maven01</path> <port>8888</port> </configuration> </plugin>
1.3.6 plugins
配置插件,是一種工具,項目並不依賴於它。比如:
- mavencleanplugin
- mavencompileplugin
<! mavencleanplugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mavencleanplugin</artifactId> <version>2.6.1</version> </plugin> <! tomcat插件 > <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7mavenplugin</artifactId> <version>2.2</version> <configuration> <path>/maven01</path> <port>8888</port> </configuration> </plugin>
1.3.7 超級POM
所有的pom.xml文件都繼承一個父POM,這個父POM稱為超級POM(Super POM、Effective POM)
二. Maven中的關系
2.1 繼承
一個Maven項目可以繼承自另一個Maven項目,分為稱為子項目、父項目
場景:多個子項目中使用的是相同的依賴或插件,此時可以把相同的配置抽取到一個父項目中,進行統一的管理,保持一致性
步驟:
1. 將父項目的打包方式設置為pom
<! 打包方式: jar:Java項目的打包方式,默認值 war:Web項目的打包方式 pom:父項目的打包方式 > <packaging>pom</packaging>
2. 在子項目中引用父項目,指定父項目的坐標
<! 引用父項目,指定父項目的坐標 > <parent> <groupId>com.wfz.study</groupId> <artifactId>parent</artifactId> <version>1.0SNAPSHOT</version> <! 指定父項目的pom.xml文件的相對物理路徑 > <relativePath>../parent/pom.xml</relativePath> </parent>
問題:有時並不是父項目的所有依賴都需要被子項目繼承,但是又希望能夠通過父項目對依賴進行統一管理,如版本的控制
解決:
使用dependencyManagement
步驟:1. 在父項目中配置dependencyManagement
dependencies:如果不用dependencyManagement做依賴管理的話,父工程的所有依賴都是可以被子工程繼承的(但特殊情況除外:scope為compile的依賴會被傳遞,scope為test的依賴不會被傳遞,配置optional為true的依賴不會被傳遞等)
問題:有時並不是父項目的所有依賴都需要被子項目繼承,但是又希望能夠通過父項目對依賴進行統一管理,如版本的控制,Scope范圍管理等,此時使用dependencyManagement對jar包進行統一管理
dependencyManagement:表示父項目只進行依賴管理,依賴(groupId,artifactId)默認不會被子項目繼承;但是version,scope可以被繼承,子工程只需寫groupId,artifactId即可,version,scope會從父工程繼承過來.但是如果子工程中也 配置version,scope的話,會默認覆蓋掉父工程的version,scope.
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
2. 在子項目中引用父項目中的
<!-- 子項目引用父項目的依賴,默認繼承了父項目的version,scope, 此時只需要再配置groupId,artifactId引用父項目的依賴就可以啦--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency> </dependencies>
2.2 聚合
將多個子項目添加到一個父項目中,然后通過能父項目進行操作,從而實現對所有聚合的子項目的操作
<!-- 聚合:將多個子項目添加到一個父項目中,然后通過對父項目進行操作,從而實現對所有聚合的子項目的操作 聚合子項目:指定子項目的根目錄 ../代表上一級目錄 --> <modules> <module>../child03</module> <module>../child01</module> <module>../child02</module> </modules>
2.3 依賴
項目C——>項目B——>項目A
概念:如果項目C依賴於項目B,項目B依賴項目A,則項目C也依賴於項目A,這叫依賴的傳遞
配置依賴關系:child03——>child02——>child01
2.3.1 控制依賴的傳遞
並不是所有的依賴都會被傳遞:
- scope為compile的依賴會被傳遞
- scope為test的依賴不會被傳遞
- 配置optional為true的依賴不會被傳遞
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <optional>true</optional> </dependency
2.3.2 不會出現jar包的沖突
使用maven不會jar包沖突,通過兩個原則來保證:
就近原則
child03——>child02——>child01
優先定義原則
child03——>child02——>child01
——>child04
2.3.3 不要傳遞的依賴
方式1:在依賴的項目中配置不允許傳遞
<optional>true</optional>
方式2:在當前項目中配置不接收傳遞的特定依賴
<! 依賴於child01> <dependency> <groupId>com.itany.study</groupId> <artifactId>child01</artifactId> <version>1.0SNAPSHOT</version> <! 不接收特定的依賴 > <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
三.使用Nexus搭建Maven私服
3.1 為什么要搭建私服
公司不提供外網給開發人員,無法使用maven訪問遠程倉庫,此時可以在局域網內找一台能訪問外網的電腦搭建maven私服
3.2 Nexus工具
用來搭建Maven私服的工具
下載地址:https://pan.baidu.com/s/1mCfnGci42uSPb8W2VmKfHw
驗證碼:s8ba
下載完畢之后,在D:\soft\maven\nexus\nexus-2.12.0-01\bin\jsw\windows-x86-64(我自己的安裝地址)安裝啟動私服即可。
常用的三個命令:
install-nexus.bat:運行install-nexus.bat安裝maven私服
start-nexus.bat:運行私服
stop-nexus.bat:停止私服
3.3 操作步驟
步驟:
1. 解壓縮並安裝為系統服務
2.訪問
http://localhost:8081/nexus
3.4 登陸並配置私服
登陸賬戶和密碼:admin/admin123
1. 添加阿里雲代理(鏡像)倉庫到私服中
2. 添加本地jar到私服中
好了,maven的相關東西就總結到這里,如果后續有需要繼續完善的,再做補充。