Maven
文章目錄
1.簡介
2.作用
-
項目構架:編譯 -->測試–>打包–>運行
-
依賴管理:jar包管理
-
項目聚合:
Maven\Gradle\Ant
3.安裝
-
配置環境變量(配置完畢後通過調用mvn -version進行測試)
變量名 值 MAVEN_HOME MAVEN項目根目錄 %MAVEN%\bin 添加到Path路徑 -
文件夾目錄
bin:含有mvn運行腳本
boot:含有plexus-classworlds類加載器框架
lib:含有Maven運行時所需要的java類庫
conf:含有setting.xml配置文件
Setting:默認repository倉庫路徑($(user)/.m2/repository),通過Maven下載的jar包都會保存在該路徑
4.倉庫配置setting.xml
-
本地倉庫:就是Maven在本機存儲構件的地方。maven的本地倉庫,在安裝maven後並不會創建,它是在第一次執行 maven命令的時候才被創建。maven本地倉庫的默認位置:在用戶的目錄下都只有一個.m2/repository/的倉庫目錄;可以修改。
<localRepository> E:/repository/maven/repos</localRepository>
-
中央倉庫:包含了絕大多數流行的開源Java構件,以及源碼、作者信息、SCM、信息、許可證信息等。開源的Java項目依賴的構件都可以在這裏下載到。
中央倉庫的地址:http://repo1.maven.org/maven2/ -
私服:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LDOvZMdY-1571881204071)(G:\QF\Markdown\pic\Pharse3\Maven\倉庫聯繫.png)]
5.私服搭建(瞭解面試):nexus maven
-
解壓文件
-
配置環境變量
變量名 值 NEXUS_HOME 安裝地址(解壓地址) %NEXUS_HOME%\bin 加入Path路徑 -
打開命令行執行命令
C:\Users\Administrator>nexus install 安裝服務 C:\Users\Administrator>nexus start 啓動服務 C:\Users\Administrator>nexus uninstall 卸載服務
-
訪問私服
默認賬戶:admin 密碼:admin123 訪問路徑:http://localhost:8081/nexus
NEXUS內部使用Jetty作爲服務器,界面通過ext.js開發
-
倉庫分類
-
host倉庫—>內部項目的發佈倉庫
-
Snapshots 發佈內部snapshots版本的倉庫
-
Releases 發佈內部release版本的倉庫
Snapshot版本代表不穩定、尚處於開發中的版本,快照版本。
Release版本則代表穩定的版本,發行版本。
3rd party 發佈第3方jar包的倉庫,如oracle數據庫驅動,open-189.jar
-
proxy倉庫—>從遠程中心倉庫查找jar包的倉庫
-
Apache Snapshots 查找Apache項目的快照版本的倉庫
-
Central 中心倉庫http://repo1.maven.org/maven2/
-
Codehaus Snapshots 查找Codehaus 的快照版本的倉庫
-
group倉庫—>把倉庫按組劃分,以組爲單位進行管理
-
virtual倉庫
-
-
私服的配置/Repository的配置
在parent模塊的pom.xml中加入私服的配置,讓Maven從私服下載jar包,而不直接去遠程倉庫下載。
默認情況下,Maven下載jar包將直接連接到外網http://repo1.maven.org/maven2/去下載;
安裝私服之後,讓Maven下載jar包先從私服查找,如果沒有,再從外網下載並保存在私服上
在POM在加入下面的配置,其中url爲NEXUS私服的Public Repository對外的地址
以後,Maven下載構建(jar包或插件)都將從這裏開始下載
<!--配置私服--> <profiles> <profile> <id>profile-nexus</id> <repositories> <repository> <id>nexus</id> <url>http://localhost:8081/nexus/content/groups/public/</url> <snapshots><enabled>true</enabled></snapshots> <releases><enabled>true</enabled></releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <url>http://localhost:8081/nexus/content/groups/public/</url> <snapshots><enabled>true</enabled></snapshots> <releases><enabled>true</enabled></releases> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>profile-nexus</activeProfile> </activeProfiles>
6.替換阿里雲鏡像
<!--在setting.xml文件中配置-->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
7.idea集成Maven
項目目錄 | 概述 |
---|---|
${basedir} | 存放pom.xml文件和所有子目錄 |
${basedir}/src/main/java | 存放java源代碼 |
${basedir}/src/main/resources | 存放項目資源文件,如properties配置文件 |
${basedir}/src/test/java | 存放測試類源碼,比如Junit代碼 |
${basedir}/src/test/resources | 存放測試需要的資源文件 |
${basedir}/target | 存放編譯後 的 classes 會放在 basedir/target/classes 下面, 和生成的JAR 文件 |
8.Maven常用命令(面試重點)
-
編譯源代碼: mvn compile
-
編譯測試代碼:mvn test-compile
-
清除產生的項目:mvn clean
-
運行測試:mvn test
-
產生site:mvn site 站點:對整個項目的描述
<!--安裝站點插件--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> <dependencies> <dependency> <groupId>org.apache.maven.doxia</groupId> <artifactId>doxia-site-renderer</artifactId> <version>1.8</version> </dependency> </dependencies> </plugin> </plugins> </build>
-
打包:mvn package
-
在本地Repository中安裝jar:mvn install
-
上傳項目到遠程倉庫:mvn deploy(更多是私服,需要用戶名密碼等認證)
9.Maven項目生命週期(面試重點)
三套生命週期:
-
Clean 清理項目對應命令: mvn clean
-
Default 最核心的生命週期 :
-
驗證:mvn validate
-
編譯:mvn compile
-
測試:mvn test
-
打包:mvn pagkage
-
安裝到倉庫:mvn install
-
發佈到遠程倉庫/私庫:mvn deploy
-
-
Site 生成站點:mvn site
clean、default、site
clean: 主要目的是清理項目
pre-clean: 執行一些清理前需要完成的工作
clean: 清理上一次構建生成的文件
post-clean: 執行一些清理後需要完成的工作
default:定義了真正構建時所需要執行的所有步驟,它是生命週期中最核心的部分
validate
initialize
generate-sources
process-sources: 處理項目主資源文件。一般來說,是對src/main/resources目錄的內容進行變量替換等工作後,複製到項目輸出的主classpath目錄中
generate-resources
process-resources
compile: 編譯項目的主源碼。一般來說,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中target
process-classes
generate-test-sources
process-test-sources: 處理項目測試資源文件。一般來說,是對src/test/resources目錄的內容進行變量替換等工作後,複製到項目輸出的測試classpath目錄中
generate-test-resources
process-test-resources
test-compile: 編譯項目的測試代碼,一般來說,是編譯src/test/java目錄下的Java文件至項目輸出的測試classpath目錄中
process-test-classes
test: 使用單元測試框架運行測試,測試代碼不會打包或部署
prepare-package
package: 接受編譯好的代碼,打包成可發佈的格式,如JAR
pre-integration-test
integration-test
post-integration-test
verify
install: 將包安裝到Maven本地倉庫,供本地其他Maven項目使用
deploy: 將最終的包複製到遠程倉庫,供其他開發人員和Maven項目使用
site生命週期: 建立和發佈項目站點,Maven能夠基於POM所包含的信息,自動生成站點
pre-site: 執行一些在生成項目站點之前需要完成的工作
site: 生成項目站點文檔
post-site: 執行一些在生成項目站點之後需要完成的工作
site-deploy: 將生成的項目站點發布到服務器上
10.pom.xml詳解(開發重要階段)
-
基本配置
pom.xml
<!--固定的--> <modelVersion>4.0.0</modelVersion> <!--描述當前項目的組織--> <groupId>cn.cdqf</groupId> <!--描述當前項目的唯一id--> <artifactId>maven_01</artifactId> <version>1.0-SNAPSHOT</version> <!--定義打包的方式 jar:默認方式 war: web項目最終打成war包 放在服務器上運行 pom:其它項目的父親 --> <packaging>war</packaging> <!--spring jar包有50個 組織+id+版本 定義常量 --> <properties> <junit.version>4.12</junit.version> </properties> <!--項目所有依賴都寫在這裏面 每一個<dependency>就表示一個依賴 groupId+artifactId+version :精確在倉庫中定位一個jar --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <!--依賴範圍--> <scope>test</scope> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> <!--排除當前jar依賴的某個jar包 一般在jar包衝突的時候使用--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 模型版本。maven2.0必須是這樣寫,現在是maven2唯一支持的版本 --> <modelVersion>4.0.0</modelVersion> <!-- 公司或者組織的唯一標誌,並且配置時生成的路徑也是由此生成, 如com.winner.trade,maven會將該項目打成的jar包放本地路徑:/com/winner/trade --> <groupId>com.winner.trade</groupId> <!-- 本項目的唯一ID,一個groupId下面可能多個項目,就是靠artifactId來區分的 --> <artifactId>trade-core</artifactId> <!-- 本項目目前所處的版本號 --> <version>1.0.0-SNAPSHOT</version> <!-- 打包的機制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默認爲jar --> <packaging>jar</packaging> <!-- 幫助定義構件輸出的一些附屬構件,附屬構件與主構件對應,有時候需要加上classifier才能唯一的確定該構件 不能直接定義項目的classifer,因爲附屬構件不是項目直接默認生成的,而是由附加的插件幫助生成的 --> <classifier>...</classifier> <!-- 定義本項目的依賴關係 --> <dependencies> <!-- 每個dependency都對應這一個jar包 --> <dependency> <!--一般情況下,maven是通過groupId、artifactId、version這三個元素值(俗稱座標)來檢索該構件, 然後引入你的工程。如果別人想引用你現在開發的這個項目(前提是已開發完畢併發布到了遠程倉庫),--> <!--就需要在他的pom文件中新建一個dependency節點,將本項目的groupId、artifactId、version寫入, maven就會把你上傳的jar包下載到他的本地 --> <groupId>com.winner.trade</groupId> <artifactId>trade-test</artifactId> <version>1.0.0-SNAPSHOT</version> <!-- maven認爲,程序對外部的依賴會隨着程序的所處階段和應用場景而變化,所以maven中的依賴關係有作用域(scope)的限制。 --> <!--scope包含如下的取值:compile(編譯範圍)、provided(已提供範圍)、runtime(運行時範圍)、test(測試範圍)、system(系統範圍) --> <scope>test</scope> <!-- 設置指依賴是否可選,默認爲false,即子項目默認都繼承:爲true,則子項目必需顯示的引入,與dependencyManagement裏定義的依賴類似 --> <optional>false</optional> <!-- 屏蔽依賴關係。 比如項目中使用的libA依賴某個庫的1.0版,libB依賴某個庫的2.0版,現在想統一使用2.0版,就應該屏蔽掉對1.0版的依賴 --> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> <!--依賴衝突包:使用路勁最短,以及優先聲明原則--> </dependency> </dependencies> <!-- 爲pom定義一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} --> <properties> <file.encoding>UTF-8</file.encoding> <java.source.version>1.5</java.source.version> <java.target.version>1.5</java.target.version> </properties> ... </project>
-
Scope介紹(面試重點)
scope
定義了依賴的範圍,默認是compile
。- compile:編譯依賴範圍,使用此依賴範圍對於編譯、測試、運行三種
classpath
都有效,即在編譯、測試和運行時都要使用該依賴jar包 - test:測試依賴範圍,只對測試有效,表明只在測試的時候需要,在編譯和運行時將無法使用該類依賴,如
junit
- provided:已提供依賴範圍。編譯和測試有效,運行無效。如
servlet-api
,在項目運行時,tomcat
等容器已經提供,無需Maven重複引入 - runtime:運行時依賴範圍。測試和運行有效,編譯無效。如
jdbc
驅動實現,編譯時只需接口,測試或運行時才需要具體的jdbc
驅動實現; - system:系統依賴範圍,使用
system
範圍的依賴時必須通過systemPath
元素顯示地指定依賴文件的路徑,不依賴Maven倉庫解析,所以可能會造成建構的不可移植,謹慎使用
- compile:編譯依賴範圍,使用此依賴範圍對於編譯、測試、運行三種
-
jar包衝突(面試重點)
傳遞依賴:某個sdk(寫得好的項目)首先這個項目會依賴某些jar,其它人 用到該sdk 需要導入sdk 的jar,也會傳遞導入sdk依賴jar
引入條件:
```xml
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
<!--排除當前jar依賴的某個jar包 一般在jar包衝突的時候使用-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dpendency>
```
11.常用插件
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding> <!--配置資源文件編碼-->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source> <!-- 源代碼使用jdk1.8支持的特性 -->
<target>1.8</target> <!-- 使用jvm1.8編譯目標代碼 -->
<compilerArgs> <!-- 傳遞參數 -->
<arg>-parameters</arg>
<arg>-Xlint:unchecked</arg>
<arg>-Xlint:deprecation </arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
插件名稱 | 用途 | 來源 |
---|---|---|
maven –clean -plugin | 清理項目 | Apache |
maven –compile -plugin | 編譯項目 | Apache |
maven –deploy -plugin | 部署項目 | Apache |
maven –install -plugin | 安裝項目 | Apache |
maven –resources -plugin | 處理資源文件 | Apache |
maven –site -plugin | 生成站點 | Apache |
maven –surefire -plugin | 執行測試 | Apache |
maven –jar -plugin | 構建JAR項目 | Apache |
maven –war -plugiin | 構建war項目 | Apache |
maven –shade -plugin | 構建包含遺憾的JAR包 | Apache |
maven –changelog -plugin | 生產版本控制變更報告 | Apache |
maven –checkstyle -plugin | 生成checkStyle報告 | Apache |
maven –javadoc –plugin | 生成JavaDoc文檔 | Apache |
maven –pmd –plugin | 生成PMD報告 | Apache |
maven –project –info -reports –plugin | 生成項目信息報告 | Apache |
maven –surefire –plugin | 生成單元測試報告 | Apache |
maven -archetype –plugin | 基於Archetype生成項目骨架 | Apache |
maven –assembly –plugin | 構建自定義格式的分佈包 | Apache |
maven –dependency –plugin | 依賴分析及控制 | Apache |
maven –enforcer –plugin | 定義規則並強制要求遵守 | Apache |
maven –pgp –plugin | 爲項目構建生成PGP簽名 | Apache |
maven -invoke –plugin | 自動運行Maven項目構建並驗證 | Apache |
maven –release –plugin | 自動項目版本發佈 | Apache |
maven –scm –plugin | 集成版本控制系統 | Apache |
maven –source –plugin | 生成源碼包 | Apache |
properties –maven –plugin | 從properties文件讀寫Maven屬性 | Codehaus |
sql –maven –plugin | 運行SQL腳本 | Codehaus |
tomcat –maven –plugin | 啓動、停止、部署項目 | Codehaus |
versions –maven –plugin | 自動化批量更新POM版本 | Codehaus |
cargo –maven –plugin | 啓動/停止/配置各類Web容器自動化部署Web項目 | Cargo |
jetty –maven –plugin | 集成jetty容器,實現快速開發測試 | Eclipse |
12.Maven聚合(重點難點)
好處:模塊重用
New
—>project
---->emptyproject
- Util模塊
- Dao模塊
- Controller模塊