一、引言
1.1 項目管理問題
寫項目時,我們需要引用各種 jar 包,尤其是比較大的工程,引用的 jar 包往往有幾十個乃至上百個, 每用到一種 jar 包,都需要手動引入工程目錄,而且經常遇到各種讓人抓狂的 jar 包沖突,版本沖突。
寫完項目我們后面還需要把代碼與各種配置文件、資源整合到一起,定型打包,如果是 web項目,還需要發布到服務器
1.1.1 繁瑣
要為每個項目手動導入所需的jar,需要搜集全部jar
1.1.2 復雜
項目中的jar如果需要版本升級,就需要再重新搜集jar
1.1.3 冗余
相同的jar在不同的項目中保存了多份
1.2 項目管理方案
Java項目需要一個統一的便捷的管理工具:Maven
Maven的好處
Maven 的一個核心特性就是依賴管理。當我們涉及到多模塊的項目(包含成百個模塊或者子項目),管理依賴就變成一項困難的任務。Maven 展示出了它對處理這種情形的高度控制。
傳統的 WEB 項目中,我們必須將工程所依賴的 jar 包復制到工程中,導致了工程的變得很大。maven 工程中不直接將 jar 包導入到工程中,而是通過在 pom.xml 文件中添加所需 jar 包的坐標,這樣就很好的避免了 jar 直接引入進來,在需要用到 jar 包的時候,只要查找 pom.xml 文件,再通過 pom.xml 文件中的坐標,到一個專門用于”存放 jar 包的倉庫”(maven 倉庫)中根據坐標從而找到這些 jar 包,再把這些 jar 包拿去運行。Maven常應用于大型項目,可以提高開發效率,也就是Maven的分模塊開發,例如:
傳統項目 按層分: dao service web
互聯網項目 按業務分: 用戶管理 訂單管理 支付管理 ...
二、介紹
Maven這個單詞來自于意第緒語(猶太語),意為知識的積累.
Maven是一個基于項目對象模型(POM)的概念的純java開發的開源的項目管理工具。主要用來管理java項目,進行依賴管理(jar包依賴管理)和項目構建(項目編譯、打包、測試、部署)。此外還能分模塊開發,提高開發效率。
項目的一鍵構建
我們的項目,往往都要經歷編譯、測試、運行、打包、安裝 ,部署等一系列過程。什么是構建?
指的是項目從編譯、測試、運行、打包、安裝 ,部署整個過程都交給 maven 進行管理,這個
過程稱為構建。一鍵構建
指的是整個構建過程,使用 maven 一個命令可以輕松完成整個工作。
三、Maven安裝
3.1 下載Maven
下載Maven
http://us.mirrors.quenda.co/apache/maven/maven-3/3.5.4/binaries/ |
---|
image.png
|
3.2 Maven安裝
3.2.1 解壓
注意: Maven 下載后,將 Maven 解壓到一個沒有中文沒有空格的路徑下,比如 D:\maven 下面
解壓后,有如下目錄:
`bin:含有mvn運行的腳本`
`boot:含有plexus-classworlds類加載器框架,Maven 使用該框架加載自己的類庫。`
`conf:含有settings.xml配置文件`
`lib:含有Maven運行時所需要的java類庫`
3.2.2 環境變量
maven依賴java環境,所以要確保java環境已配置好
使用maven必須配置JDK。
在環境變量 path 配置 MAVEN 安裝目錄的bin目錄(和之前jdk的配置類似)
`MAVEN_HOME = maven的安裝目錄`
`PATH = maven的安裝目錄下的bin目錄`
3.2.3 測試
查看maven版本信息
mvn -v
四、Maven配置
4.1 本地倉庫
maven的conf目錄中有 settings.xml ,是maven的配置文件,做如下配置:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- 選擇一個磁盤目錄,作為本地倉庫 -->
<localRepository>D:\Program Files\maven\myrepository</localRepository>
4.2 JDK配置
在 <profiles> 標簽中 增加 一個 <profile> 標簽,限定maven項目默認的jdk版本.
內容如下:
<profiles>
<!-- 在已有的profiles標簽中添加profile標簽 -->
<profile>
<id>myjdk</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<!-- 讓增加的 profile生效 -->
<activeProfiles>
<activeProfile>myjdk</activeProfile>
</activeProfiles>
五、倉庫
5.1 概念
存儲依賴的地方,體現形式就是本地的一個目錄。
倉庫中不僅存放依賴,而且管理著每個依賴的唯一標識(坐標),Java項目憑坐標獲取依賴。
5.2 倉庫分類
maven 中倉庫的類型:
本地倉庫 :用來存儲從遠程倉庫或中央倉庫下載的插件和 jar 包,項目使用一些插件或 jar 包,
優先從本地倉庫查找
默認本地倉庫位置在{user.dir}表示windows 用戶目錄。
注意:可在 MAVE_HOME/conf/settings.xml 文件中配置本地倉庫位置。遠程倉庫:如果本地需要插件或者 jar 包,本地倉庫沒有,默認去遠程倉庫下載。
遠程倉庫可以在互聯網內也可以在局域網內。中央倉庫 :在 maven 軟件中內置一個遠程倉庫地址 http://repo1.maven.org/maven2 ,它是中央倉庫,服務于整個互聯網,它是由 Maven 團隊自己維護,里面存儲了非常全的 jar 包,它包含了世界上大部分流行的開源項目構件。
倉庫分類 |
---|
image.png
|
當需要依賴時,會從倉庫中取查找,優先順序為:
5.3 本地倉庫
即在settings.xml 中配置的目錄。
使用過了的依賴都會自動存儲在本地倉庫中,后續可以復用。
5.4 遠程倉庫
5.4.1 中央倉庫
Maven 中央倉庫是由 Maven 社區提供的倉庫,不用任何配置,maven中內置了中央倉庫的地址。
其中包含了絕大多數流行的開源Java構件。
https://mvnrepository.com/ 可以搜索需要的依賴的相關信息(倉庫搜索服務)
5.4.2 公共倉庫【重點
】
除中央倉庫之外,還有其他遠程倉庫。
比如aliyun倉庫(http://maven.aliyun.com/nexus/content/groups/public/)中央倉庫在國外,下載依賴速度過慢,所以都會配置一個國內的公共倉庫替代中央倉庫。
<!--setting.xml中添加如下配置-->
<mirrors>
<mirror>
<id>aliyun</id>
<!-- 中心倉庫的 mirror(鏡像) -->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<!-- aliyun倉庫地址 以后所有要指向中心倉庫的請求,都會指向aliyun倉庫-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
5.4.3 私服【了解】
公司范圍內共享的倉庫,不對外開放。
可以通過 Nexus來創建、管理一個私服。
六、Idea-Maven
6.1 在Idea中關聯Maven
在idea中關聯本地安裝的maven,后續就可以通過idea使用maven來管理項目
Maven 工程的目錄結構
作為一個 maven 工程,它的 src目錄和 pom.xml 是必備的。
進入 src目錄后,我們發現它里面的目錄結構如下:src/main/java —— 存放項目的.java 文件
src/main/resources —— 存放項目資源文件,如 spring, hibernate 配置文件
src/test/java —— 存放所有單元測試.java 文件,如 JUnit 測試類
src/test/resources —— 測試資源文件
target —— 項目輸出位置,編譯后的class 文件會輸出到此目錄
pom.xml——maven 項目核心配置文件注意:如果是普通的 java 項目,那么就沒有webapp 目錄。
在全局設置中,關聯Maven |
---|
image.png
|
6.2 創建Maven項目
6.2.1 新建項目
新建項目,要選擇 Maven 選項
如下選項 |
---|
image.png
|
6.2.2 指定項目名
設置項目名 |
---|
image.png
|
6.2.3 項目位置
項目位置如下 |
---|
image.png
|
6.2.4 項目結構
src/main/java 存放源代碼,建包,放項目中代碼(service,dao,User,....)
src/main/resources 書寫配置文件,項目中的配置文件(jdbc.properties)
src/test/java 書寫測試代碼,項目中測試案例代碼
src/test/resources 書寫測試案例相關配置文件
目根/pom.xml (project object model) maven項目核心文件,其中定義項目構建方式,聲明依賴等
注意:項目中的建包,建類,執行,都和普通項目無差異
項目結構如下: |
---|
image.png
|
6.2.5 pom.xml文件
pom 基本配置
pom.xml 是 Maven 項目的核心配置文件,位于每個工程的根目錄,基本配置如下
<project > :文件的根節點 .
<modelversion > : pom.xml 使用的對象模型版本
<groupId > :項目名稱,一般寫項目的域名
<artifactId > :模塊名稱,子項目名或模塊名稱
<version > :產品的版本號 .
<packaging > :打包類型,一般有 jar、war、pom 等
<name > :項目的顯示名,常用于 Maven 生成的文檔。
<description > :項目描述,常用于 Maven 生成的文檔
<dependencies> :項目依賴構件配置,配置項目依賴構件的坐標
<build> :項目構建配置,配置編譯、運行插件等。
例如:配置tomcat7插件和jdk1.8
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
在 pom.xml 文件中鎖定 jar 包版本配置
<!-- 統一管理jar包版本 -->
<properties>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<!-- 鎖定jar包版本(可省略) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 項目依賴jar包 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
6.2.6 項目類型
根據項目類型,在pom.xml中做出對應配置,添加配置:<packaging>war/jar</packaging>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qf</groupId>
<artifactId>test01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式,如果是java項目則用 jar,
如果是web項目則用war -->
<!--<packaging>war</packaging>-->
<packaging>jar</packaging>
</project>
6.3 導入依賴jar
建好項目后,需要導入需要的jar,要通過坐標
每個構件都有自己的坐標 = groupId + artifactId + version = 項目標識 + 項目名 + 版本號
在maven項目中只需要配置坐標,maven便會自動加載對應依賴。刪除坐標則會移除依賴
6.3.1 查找依賴
依賴查找服務:https://mvnrepository.com/ ,獲得依賴的坐標,在maven項目中導入。
查找依賴坐標 |
---|
image.png
|
image.png
|
6.3.2 導入依賴
在項目的pom文件中,增加依賴
在項目的pom.xml文件添加依賴 |
---|
image.png
|
6.3.3 同步依賴
引入坐標后,同步依賴,確認導入。
窗口右下角彈窗,刷新依賴,使新加的配置被maven加載 |
---|
image.png
|
6.4 創建web項目
6.4.1 打包方式
pom.xml中設置 <packaging>war</packaging>
web項目打包方式為:war |
---|
image.png
|
6.4.2 web依賴
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<packaging>war</packaging>
<!-- 導入JSP 和 Servlet 和 JSTL 依賴 -->
<dependencies>
<dependency>
<!-- jstl 支持 -->
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<!-- servlet編譯環境 -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- jsp編譯環境 -->
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
6.4.3 webapp目錄
按照maven規范,新建web項目特有目錄
新建如下目錄和文件 |
---|
image.png
|
<?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_4_0.xsd"
version="4.0">
<!-- 這是一個空白的web.xml文件模板 -->
</web-app>
6.4.4 定義Servlet和Jsp
照常定義即可 |
---|
image.png
|
6.5 部署web項目
6.5.1 新增Tomcat
新增Tomcat |
---|
image.png
|
image.png
|
image.png
|
6.5.2 部署web項目
部署web項目 |
---|
image.png
|
image.png
|
image.png
|
6.5.3 啟動Tomcat
啟動Tomcat |
---|
image.png
|
image.png
|
6.6 依賴生命周期
6.6.1 概念
Jar包生效的時間段,即Jar的生命周期
依賴范圍
在 pom.xml 文件中添加坐標時需要指定依賴范圍(scope標簽),依賴范圍包括:compile:編譯范圍,指 A在編譯時依賴 B,此范圍為默認依賴范圍。編譯范圍的依賴會用在
編譯、測試、運行,由于運行時需要所以編譯范圍的依賴會被打包。provided:provided 依賴只有在當 JDK 或者一個容器已提供該依賴之后才使用, provided 依
賴在編譯和測試時需要,在運行時不需要,比如:servlet api 被 tomcat 容器提供。runtime:runtime 依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如:jdbc
的驅動包。由于運行時需要所以 runtime 范圍的依賴會被打包。test:test 范圍依賴 在編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用,
比如:junit。由于運行時不需要所以test范圍依賴不會被打包。system:system 范圍依賴與 provided 類似,但是你必須顯式的提供一個對于本地系統中 JAR
文件的路徑,需要指定 systemPath 磁盤路徑,system依賴不推薦使用。
6.6.2 使用方式
項目中導入的依賴可以做生命周期的管理
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
<!-- 生命周期 -->
<scope>compile</scope>
</dependency>
<dependency>
<!-- servlet編譯環境 -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 生命周期 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 生命周期 -->
<scope>test</scope>
</dependency>
6.6.3 生命周期詳解
標識 | 周期 |
---|---|
compile | 缺省值,適用于所有階段(測試運行,編譯,運行,打包) |
provided | 類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet-api.jar;適用于(測試運行,編譯)階段 |
runtime | 只在運行時使用,如 mysql的驅動jar,適用于(運行,測試運行)階段 |
test | 只在測試時使用,適用于(編譯,測試運行)階段,如 junit.jar |
system | Maven不會在倉庫中查找對應依賴,在本地磁盤目錄中查找;適用于(編譯,測試運行,運行)階段 |
七、Maven指令
7.1 命令行
通過Idea打開 cmd,然后執行Maven指令
Maven的常用命令
clean 清理編譯的文件(清理target文件夾)
compile 編譯了主目錄的文件(只編譯項目中src\main目錄下的代碼)
test 編譯并運行了測試目錄的文件(編譯運行src\test目錄下的代碼)
package 打包(將war包,該war的命名規范取決于pom.xml文件中的命名)
install 就是把項目發布到本地倉庫
deploy 上傳到私服
tomcat:run 一鍵啟動
打開 cmd,并定位到項目目錄 |
---|
image.png
|
執行maven指令 |
---|
image.png
|
7.2 Maven面板
Idea中有Maven面板,其中可以快速執行Maven指令
maven面板 |
---|
image.png
|
八、私服
8.1 概念
私服是架設在局域網的一種特殊的遠程倉庫,目的是代理遠程倉庫及部署第三方構件。
有了私服之后,當 Maven 需要下載依賴時,直接請求私服,私服上存在則下載到本地倉庫;否則,私服請求外部的遠程倉庫,將構件下載到私服,再提供給本地倉庫下載。
私服可以解決在企業做開發時每次需要的jar包都要在中心倉庫下載,且每次下載完只能被自己使用,不能被其他開發人員使用
所謂私服就是一個服務器,但是不是本地層面的,是公司層面的,公司中所有的開發人員都在使用同一個私服
8.2 架構
無私服 | 有私服 |
---|---|
image.png
| |
image.png
| |
我們可以使用專門的 Maven 倉庫管理軟件來搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。這里我們使用 Sonatype Nexus
8.3 Nexus安裝【了解】
8.3.1 下載
8.3.2 安裝
下載nexus-2.x-bundle.zip,解壓即可
nexus安裝目錄 |
---|
image.png
|
8.4 啟動【了解】
- 解壓后在bin目錄中執行:
- nexus install 在系統中安裝nexus服務
- nexus uninstall 卸載nexus服務
- nexus start 啟動服務
- nexus stop 停止服務
8.5 Nexus登錄【了解】
登錄Nexus才可以使用Nexus管理功能 |
---|
image.png
|
8.6 倉庫列表【了解】
倉庫類型 | 描述 |
---|---|
group | 包含多個倉庫,通過group庫的地址可以從包含的多個倉庫中查找構件 |
hosted | 私服 服務器本地的倉庫,其中存儲諸多構件 |
proxy | 代理倉庫,其會關聯一個遠程倉庫, 比如中央倉庫,aliyun倉庫,向該倉庫查找構件時,如果沒有會從其關聯的倉庫中下載 |
倉庫名 | 描述 |
---|---|
Releases | 存放項目的穩定發布版本,一個模塊做完后如果需要共享給他人,可以上傳到私服的該庫 |
Snapshots | 對應不穩定的發布版本 |
3rd party | 存放中央倉庫沒有的 ,如ojdbc.jar,可以上傳到私服的該庫中 |
倉庫列表 |
---|
image.png
|
8.7 Maven配置私服 【重點
】
在maven中配置私服,使得maven可以從私服上獲取構件
8.7.1 倉庫組
而此時就有問題,私服中有很多倉庫,每個倉庫都有自己的url,則項目中配置哪個倉庫呢 ?
私服中有一個倉庫組,組中包含多個倉庫,可以指定倉庫組的url,即可從多個倉庫中獲取構件
倉庫組 注意:proxy的倉庫排序在最后 |
---|
image.png
|
8.7.2 Maven關聯私服
配置settings.xml,設置私服地址、認證等信息
<servers>
<server>
<id>nexus-public</id> <!-- nexus的認證id -->
<username>admin</username> <!--nexus中的用戶名密碼-->
<password>admin123</password>
</server>
</servers>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus-public</id> <!--nexus認證id 【此處的repository的id要和 <server>的id保持一致】-->
<!--name隨便-->
<name>Nexus Release Snapshot Repository</name>
<!--地址是nexus中倉庫組對應的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories> <!--插件倉庫地址,各節點的含義和上面是一樣的-->
<pluginRepository>
<id>nexus-public</id> <!--nexus認證id 【此處的repository的id要和 <server>的id保持一致】-->
<!--地址是nexus中倉庫組對應的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>yourjdk</activeProfile>
<!-- 使私服配置生效 -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
至此,Maven項目中需要依賴時,Maven會從私服中下載
8.8 Maven項目部署到私服
執行 :mvn deploy 即可將項目部署到私服對應的倉庫中,此時項目中的打包方式多為jar
但需要提前在項目的pom.xml中配置部署私服倉庫位置,如下:
...
<dependencies>
.....
</dependencies>
<!-- 在項目的pom.xml中 配置私服的倉庫地址,可以將項目打jar包部署到私服 -->
<distributionManagement>
<repository>
<id>nexus-public</id> <!-- nexus認證id -->
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-public</id> <!-- nexus認證id -->
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
注意:如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通過私服的認證
九、Maven分模塊開發
Maven 分模塊開發
1.先創建父工程,pom.xml文件中,打包方式為pom
2.右鍵父工程創建子工程,dao工程和service工程打包方式為jar,web工程打包方式為war
3.每完成一個模塊后需要install,如果在IDEA中install時報錯(JDK版本過低),需要在父工程的pom.xml文件中配置如下代碼:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<configuration>
<!--<encoding-->
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>