Maven入门详解与安装配置
Maven:
Maven出現(xiàn)前的問題:
假設(shè)你現(xiàn)在做了一個(gè)項(xiàng)目,項(xiàng)目中肯定要用到一些jar包,比如說mybatis,log4j,JUnit等,除了這些之外,你有可能用到你的同事開發(fā)的其他的東西,比如說別人做了一個(gè)財(cái)務(wù)模塊或做了一個(gè)結(jié)算的模塊,你在這里邊有可能要用到這些東西。假如有一天你們的項(xiàng)目中mybatis進(jìn)行了一個(gè)升級(jí),但是它內(nèi)部使用的JUnit沒有升級(jí),你升級(jí)以后的mybatis假如要用5.0的JUnit,而你項(xiàng)目中目前用的是4.0的,會(huì)不會(huì)沖突?必然會(huì)出問題!這個(gè)時(shí)候管理起來會(huì)比較麻煩,你需要各種調(diào)整。更有甚者,假如同事做的這些東西升級(jí)了但又沒有通知你,這個(gè)時(shí)候,就會(huì)出現(xiàn)幾種嚴(yán)重的問題:
Maven的本質(zhì)是一個(gè)項(xiàng)目管理工具,將項(xiàng)目開發(fā)和管理過程抽象成一個(gè)項(xiàng)目對(duì)象模型(POM)
Maven通過加載pom.xml這個(gè)配置文件就可以知道我們項(xiàng)目的相關(guān)信息,如果我們做8個(gè)項(xiàng)目,對(duì)應(yīng)的是1個(gè)文件,還是8個(gè)文件?肯定是8個(gè)!
Maven是如何幫我們進(jìn)行項(xiàng)目資源管理的呢?
- 通過依賴管理
- 所謂依賴管理就是maven對(duì)項(xiàng)目所有依賴資源的一種管理,它和項(xiàng)目之間是一種雙向關(guān)系,當(dāng)我們做項(xiàng)目的時(shí)候maven的依賴管理可以幫助你去管理你所需要的其他資源,當(dāng)其他的項(xiàng)目需要依賴我們項(xiàng)目的時(shí)候,maven也會(huì)把我們的項(xiàng)目當(dāng)作一種資源去進(jìn)行管理,這就是一種雙向關(guān)系。
Maven的依賴管理資源存在哪兒呢?
- 本地倉(cāng)庫(kù)私服、中央倉(cāng)庫(kù)
- 本地倉(cāng)庫(kù)顧名思義就是存儲(chǔ)在本地的一種資源倉(cāng)庫(kù),如果本地倉(cāng)庫(kù)中沒有相關(guān)資源,可以去私服上獲取,私服也是一個(gè)資源倉(cāng)庫(kù),只不過不在本地,是一種遠(yuǎn)程倉(cāng)庫(kù),如果私服上也沒有相關(guān)資源,可以去中央倉(cāng)庫(kù)去獲取,中央倉(cāng)庫(kù)也是一種遠(yuǎn)程倉(cāng)庫(kù)。
- Maven除了幫我們管理項(xiàng)目資源之外還能幫助我們對(duì)項(xiàng)目進(jìn)行構(gòu)建,管理項(xiàng)目的整個(gè)生命周期,當(dāng)然它的這些功能需要使用一些相關(guān)的插件來完成,當(dāng)然整個(gè)生命周期過程中插件是需要配合使用的,單獨(dú)一個(gè)無法完成完整的生命周期。
Maven的作用:
各目錄存放資源類型說明:
- src/main/java:項(xiàng)目java源碼
- src/main/resources:項(xiàng)目的相關(guān)配置文件(比如mybatis配置,xml映射配置,自定義配置文件等)
- src/main/webapp:web資源(比如html,css,js等)
- src/test/java:測(cè)試代碼
- src/test/resources:測(cè)試相關(guān)配置文件
- src/pom.xml:項(xiàng)目pom文件
Maven環(huán)境搭建:
maven的官網(wǎng):http://maven.apache.org/
官方下載地址:http://maven.apache.org/download.cgi
maven各目錄結(jié)構(gòu)說明:
- bin:可執(zhí)行程序目錄
- boot:maven自身的啟動(dòng)加載器
- conf:maven配置文件的存放目錄
- lib:maven運(yùn)行所需庫(kù)的存放目錄
Win系統(tǒng)環(huán)境配置:
新建系統(tǒng)環(huán)境變量MAVEN_HOME然后輸入maven所在的路徑
系統(tǒng)變量值就是maven軟件的根目錄
MacOs系統(tǒng)配置:
官網(wǎng)下載:https://maven.apache.org/download.cgi
全局settings與局部settings:
- 全局settings:當(dāng)前計(jì)算機(jī)中Maven公共配置
- 局部settings:當(dāng)前用戶的配置(本地倉(cāng)庫(kù)就是局部的)
把settings文件里默認(rèn)加的mirror標(biāo)簽注釋掉,換成下面的阿里云的鏡像在國(guó)內(nèi)使用會(huì)快一點(diǎn)
換成下面這個(gè)
倉(cāng)庫(kù):
- 倉(cāng)庫(kù):用于存儲(chǔ)資源,主要是各種jar包
- 中央倉(cāng)庫(kù):maven團(tuán)隊(duì)自身維護(hù)的倉(cāng)庫(kù),里面所有的jar包都是開源的
- 私服:各公司/部門等小范圍內(nèi)存儲(chǔ)資源的倉(cāng)庫(kù),私服也可以從中央倉(cāng)庫(kù)獲取資源
- 私服的作用:
- 保存具有版權(quán)的資源,包含購(gòu)買或自主研發(fā)的jar
- 解決遠(yuǎn)程訪問中中央倉(cāng)庫(kù)速度慢的問題
- 一定范圍內(nèi)共享資源,能做到僅對(duì)內(nèi)不對(duì)外開放
- 本地獲取私服的,私服有了就直接返回,沒有的話才去中央倉(cāng)庫(kù)獲取
- 本地倉(cāng)庫(kù):開發(fā)者自己電腦上存儲(chǔ)資源的倉(cāng)庫(kù),也可從遠(yuǎn)程倉(cāng)庫(kù)獲取資源
坐標(biāo):
坐標(biāo):maven中的坐標(biāo)用于描述倉(cāng)庫(kù)中資源的位置
https://repo1.maven.org/maven2/
maven坐標(biāo)的作用:
使用唯一標(biāo)識(shí),唯一性定義資源位置,通過該標(biāo)識(shí)可以將資源的識(shí)別與下載工作交由機(jī)器完成。
maven坐標(biāo)的主要組成如下:
-
groupId:定義當(dāng)前資源隸屬組織名稱(通常是域名反寫,如:org.mybatis;com.itheima)
-
artifactId:定義當(dāng)前資源的名稱(通常是項(xiàng)目或模塊名稱,如:crm,sms)
-
version:定義當(dāng)前資源的版本號(hào)
-
packaging:定義資源的打包方式,取值一般有如下三種
- jar:該資源打成jar包,默認(rèn)是jar
- war:該資源打成war包
- pom:該資源是一個(gè)父資源(表明使用maven分模塊管理),打包時(shí)只生成一個(gè)pom.xml不生成jar或其他包結(jié)構(gòu)
如果要查詢maven某一個(gè)資源的坐標(biāo),可以去maven的倉(cāng)庫(kù)進(jìn)行查詢,https://mvnrepository.com/,在該網(wǎng)站中可直接搜索想要的資源,然后就能得到該資源的坐標(biāo)
maven構(gòu)建命令:
maven的構(gòu)建命令以mvn開頭,后面添加功能參數(shù),可以一次性執(zhí)行多個(gè)命令,用空格分離,這些在idea不需要手動(dòng)。
mvn compile:編譯
- 編譯完成后在項(xiàng)目project-java下多了一個(gè)目錄target,在這個(gè)目錄下就存放的是maven編譯好的一些東西和字節(jié)碼文件
mvn clean:清理
- 需要?jiǎng)h除這些文件執(zhí)行mvn clean命令即可,清理掉后target目錄也就消失了
mvn test:測(cè)試
- 其中產(chǎn)生的test-classes就是測(cè)試代碼的字節(jié)碼文件,surefire-reports是它產(chǎn)生的測(cè)試報(bào)告
mvn package:打包
- 執(zhí)行測(cè)試包中的測(cè)試程序,只需執(zhí)行mvn test命令即可
mvn install:安裝到本地倉(cāng)庫(kù)
- 輸出會(huì)發(fā)現(xiàn)mvn install命令執(zhí)行的時(shí)候也會(huì)將前面的命令都執(zhí)行一遍
- maven是按照groupId/artifactId/version的結(jié)構(gòu)在本地倉(cāng)庫(kù)進(jìn)行存儲(chǔ)
idea配置maven:
新建java項(xiàng)目選擇maven
新建web項(xiàng)目選擇這個(gè)
打開idea的設(shè)置搜索maven,然后修改下面三個(gè)地址就可以了
創(chuàng)建好了以后檢查maven工程的格式和依賴
pom解析:
<?xml version="1.0" encoding="UTF-8"?><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/maven-v4_0_0.xsd"><!--指定pom模型的版本--><modelVersion>4.0.0</modelVersion><!--打包方式,web打wer包,java打jar包--><packaging>war</packaging><name>untitled2</name><!--組織名--><groupId>org.example</groupId><!--項(xiàng)目名--><artifactId>untitled2</artifactId><!--版本--><version>1.0-SNAPSHOT</version><!--設(shè)置當(dāng)前工程所有依賴--><dependencies><!--具體的依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><!--構(gòu)建--><build><!--設(shè)置插件--><plugins><!--具體的插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat-maven-plugin-it</artifactId><version>2.1</version></plugin></plugins></build></project>檢查maven是否可以下載:
經(jīng)過我無數(shù)小時(shí)的報(bào)錯(cuò)我總結(jié)了報(bào)錯(cuò)原因大多數(shù)是以下幾點(diǎn):
把下面常用的jar導(dǎo)入測(cè)試下載速度:
<dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.3</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.12.0-rc1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.12.0-rc1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.0-rc1</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId><version>1.6</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest</artifactId><version>2.2</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-all</artifactId><version>1.3</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-library</artifactId><version>2.2</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><dependency><groupId>com.jolbox</groupId><artifactId>bonecp</artifactId><version>0.8.0.RELEASE</version></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.6.8</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.29</version></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.3.175</version></dependency><dependency><groupId>org.hsqldb</groupId><artifactId>hsqldb</artifactId><version>2.3.2</version></dependency><dependency><groupId>com.fasterxml.jackson.jaxrs</groupId><artifactId>jackson-jaxrs-xml-provider</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.39</version></dependency><dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-core</artifactId><version>2.2.2</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-jsp</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-servlet</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-template</artifactId><version>2.2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version><scope>provided</scope></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version><scope>provided</scope></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.0.2.RELEASE</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.2.RELEASE</version><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument-tomcat</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc-portlet</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.7.4</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>3.2.2.RELEASE</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>3.2.2.RELEASE</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>3.2.2.RELEASE</version></dependency><dependency><groupId>org.springframework.webflow</groupId><artifactId>spring-webflow</artifactId><version>2.3.2.RELEASE</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.3</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.2.5</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-asm</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.6</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.6</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId><version>1.7.6</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.1.1</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.logback-extensions</groupId><artifactId>logback-ext-spring</artifactId><version>0.1.1</version></dependency></dependencies>Maven依賴管理:
依賴是指在當(dāng)前項(xiàng)目中運(yùn)行所需的jar,依賴配置的格式如下圖
依賴傳遞:
依賴傳遞:
項(xiàng)目A想用項(xiàng)目B的東西,只需要把項(xiàng)目B的坐標(biāo)加在pom文件里就可以了,如果項(xiàng)目B還用到了項(xiàng)目C的東西,在項(xiàng)目A也是可以用的
<dependencies><!--項(xiàng)目2的坐標(biāo)--><dependency><groupId>org.example</groupId><artifactId>maven01</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>依賴傳遞的沖突問題:
在依賴傳遞過程中產(chǎn)生了沖突,我們有三種優(yōu)先法則
可選依賴:
加optional標(biāo)簽,設(shè)為true,
作用:不想讓別人知道自己用的maven用了什么就用可選
<dependencies><dependency><groupId>org.example</groupId><artifactId>maven01</artifactId><version>1.0-SNAPSHOT</version><optional>true</optional></dependency></dependencies>排除依賴:
加exclusions,復(fù)制要排除的資源信息
作用:排除依賴指主動(dòng)斷開依賴的資源,被排除的資源無需執(zhí)行版本,依賴傳過來不想用,就加這個(gè)
依賴范圍:
依賴的jar默認(rèn)情況可以在任何地方可用,可以通過scope標(biāo)簽設(shè)定其作用范圍
這里的范圍主要是指以下三種范圍
此外:scope標(biāo)簽的取值有四種:compile,test,provided,runtime
這四種取值與范圍的對(duì)應(yīng)情況如下:
依賴范圍的傳遞性:
Maven生命周期:
maven的構(gòu)建生命周期描述的是一次構(gòu)建過程經(jīng)歷了多少個(gè)事件
生命周期是運(yùn)行的階段,插件是為了支持聲明周期存在,構(gòu)建過程就是靠這倆的
pre-clean:執(zhí)行一些在clean之前的工作
clean:移除上一次構(gòu)建產(chǎn)生的所有文件
post-clean:執(zhí)行一些在clean之后立刻完成的工作
執(zhí)行test那就把test前面所有的都執(zhí)行一遍,執(zhí)行default就把default前面的都執(zhí)行一遍,以此類推
pre-site:執(zhí)行一些在生成站點(diǎn)文檔之前的工作
site:生成項(xiàng)目的站點(diǎn)文檔
post-site:執(zhí)行一些在生成站點(diǎn)文檔之后完成的工作,為部署做準(zhǔn)備
site-deploy:將生成的站點(diǎn)文檔部署到特定的服務(wù)器上
插件:
- 插件與生命周期內(nèi)的階段綁定,在執(zhí)行到對(duì)應(yīng)生命周期時(shí)執(zhí)行對(duì)應(yīng)的插件
- maven默認(rèn)在各個(gè)生命周期上都綁定了預(yù)先設(shè)定的插件來完成相應(yīng)功能
- 插件還可以完成一些自定義功能
插件的配置方式如下:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.4</version><executions><execution><goals><!-- 可以打多個(gè)包 --><goal>jar</goal><goal>test-jar</goal></goals><phase>generate-test-resources</phase></execution></executions></plugin></plugins>在maven官網(wǎng)中有對(duì)插件的介紹:
http://maven.apache.org/plugins/index.html
總結(jié)
以上是生活随笔為你收集整理的Maven入门详解与安装配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进制原码反码补码
- 下一篇: 利用IDEA部署过的Tomcat开发We