視頻課程鏈接:http://edu.51cto.com/course/13014.html
六、pom.xml文件
1. 簡介
pom:project object model 項目對象模型
pom.xml是Maven的核心配置文件
一個Maven項目有且只有一個pom.xml文件,該文件必須在項目的根目錄下
2.座標
2.1 什麼是座標
用來唯一的標識每個標識,必須爲項目定義座標,座標必須唯一
目的是爲了讓其他Maven項目可以使用該項目生成的jar包
2.2 座標詳解
Maven座標是通過一些元素來定義:groupId、artifactId、version
<!--
座標:
groupId:組織Id,表示當着模塊所隸屬的項目
artifactId:模塊id
version:當前的版本
-->
<groupId>com.itany.study</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
3.dependency
3.1 基本配置
如何查找一個jar包的座標?
http://search.maven.org/ 或 http://mvnrepository.com/ 或http://maven.aliyun.com/nexus/#
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
3.2 scope作用域
表示依賴的作用域,用來配置依賴的jar包可使用的範圍
取值 | 含義 | 舉例 |
---|---|---|
compile | 該依賴可以在整個項目中使用,參與打包部署,默認值 | commons-fileupload |
test | 該依賴只能在測試代碼中使用,不參與打包部署 | junit |
provided | 該依賴編寫源代碼時需要,不參與打包部署 | servlet-api、jsp-api |
runtime | 該依賴編寫代碼時不需要,運行時需要,參與打包部署 | mysql-connector |
system | 表示使用本地系統路徑下的jar包,需要和systemPath一起使用 | ojdbc.jar |
4. properties
全局屬性,一般情況下用於定義全局的jar包版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<fileupload.version>1.3.1</fileupload.version>
<junit.version>4.12</junit.version>
<mysql-connector-java.version>5.1.38</mysql-connector-java.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>
5.repositories
用來配置當前工程使用的遠程倉庫
依賴查找順序:本地倉庫——>當前工程pom.xml中配置的遠程倉庫——>setting.xml中配置的遠程倉庫
<!-- 配置遠程倉庫 -->
<repositories>
<!-- 有些最新的jar包,可能在中央倉庫上並沒有提供,此時可以使用jar包官方提供的倉庫 -->
<repository>
<id>spring_repo</id>
<url>http://repo.spring.io/milestone</url>
</repository>
</repositories>
6.plugins
配置插件,是一種工具
- maven-clean-plugin
- maven-compile-plugin
<!-- maven-clean-plugin-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.6.1</version>
</plugin>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/maven01</path>
<port>8888</port>
</configuration>
</plugin>
7.超級POM
所有的pom.xml文件都繼承一個父POM,這個父POM稱爲超級POM(Super POM、Effective POM)
七、Maven中的關係
1.繼承
一個Maven項目可以繼承自另一個Maven項目,分爲稱爲子項目、父項目
場景:多個子項目中使用的是相同的依賴或插件,此時可以把相同的配置抽取到一個父項目中,進行統一的管理,保持一致性
步驟:
-
將父項目的打包方式設置爲pom
<!-- 打包方式: jar:Java項目的打包方式,默認值 war:Web項目的打包方式 pom:父項目的打包方式 --> <packaging>pom</packaging>
-
在子項目中引用父項目,指定父項目的座標
<!-- 引用父項目,指定父項目的座標 --> <parent> <groupId>com.itany.study</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 指定父項目的pom.xml文件的相對物理路徑 --> <relativePath>../parent/pom.xml</relativePath> </parent>
問題:有時並不是父項目的所有依賴都需要被子項目繼承,但是又希望能夠通過父項目對依賴進行統一管理,如版本的控制
解決:使用dependencyManagement
步驟:
- 在父項目中配置dependencyManagement
- 在子項目中引用父項目中的依賴
2.聚合
將多個子項目添加到一個父項目中,然後通過能父項目進行操作,從而實現對所有聚合的子項目的操作
<!-- 聚合子項目,指定子項目的根目錄-->
<modules>
<module>../child01</module>
<module>../child02</module>
</modules>
3.依賴
項目C——>項目B——>項目A
概念:如果項目C依賴於項目B,項目B依賴項目A,則項目C也依賴於項目A,這叫依賴的傳遞
配置依賴關係:child03——>child02——>child01
3.1 控制依賴的傳遞
並不是所有的依賴都會被傳遞:
-
scope爲compile的依賴會被傳遞
-
scope爲test的依賴不會被傳遞
-
配置optional爲true的依賴不會被傳遞
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <optional>true</optional> </dependency>
3.2 不會出現jar包的衝突
使用maven不會jar包衝突,通過兩個原則來保證:
-
就近原則
child03——>child02——>child01
-
優先定義原則
child03——>child02——>child01
——>child04
3.3 不要傳遞的依賴
方式1:在依賴的項目中配置不允許傳遞
<optional>true</optional>
方式2:在當前項目中配置不接收傳遞的特定依賴
<!-- 依賴於child01-->
<dependency>
<groupId>com.itany.study</groupId>
<artifactId>child01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 不接收特定的依賴 -->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
八、Maven Web項目
步驟:
-
修改web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> </web-app>
-
配置pom.xml
<dependencies> <!-- Java EE --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>maven02</finalName> <!-- tomcat插件 --> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <port>8888</port> </configuration> </plugin> </plugins> </build>
九、使用Nexus搭建Maven私服
1. 爲什麼要搭建私服
公司不提供外網給開發人員,無法使用maven訪問遠程倉庫,此時可以在局域網內找一臺能訪問外網的電腦搭建maven私服
2. Nexus工具
用來搭建nexus工具
3. 操作步驟
步驟:
-
解壓縮並安裝爲系統服務
nexus-2.14.2-01-bundle\nexus-2.14.2-01\bin\jsw\windows-x86-64\install-nexus.bat
-
訪問
4. 登陸並配置私服
登陸賬戶和密碼:admin/admin123
1. 添加阿里雲代理(鏡像)倉庫到私服中
2. 添加本地jar到私服中
十、Maven綜合應用
1. 分析
將項目分爲多個工程,可以按層次分,也可以按模塊,或同時按層次和模塊分
以ums爲例,使用maven創建和管理項目:
- 父工程:ums-parent
- dao工程:ums-dao
- sevice工程:ums-service
- action工程:ums-action
2. 步驟:
2.1 創建工程
2.2 配置依賴
- 在父工程中添加依賴
- 在子工程中引用依賴
2.3 配置dao工程
映射文件存儲位置,兩種方式:
-
將映射文件放在resources目錄下
會被打包部署
-
將映射文件放在java目錄下
默認只會對該目錄下的java代碼進行打包部署,如果希望對該目錄下的配置文件也進行打包,需要額外的配置
<build> <!-- 將java目錄下的配置文件也進行打包 --> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>