maven基本使用-個人手稿版
一.項目會遇到什么事情?
1,構建:編譯代碼,運行測試,打包,部署應用,運行服務器等;
2,依賴:項目依賴大量的第三方包,第三方包又依賴另外的包;對依賴包的管理非常麻煩;
Maven能做什么事情?
1,Maven翻譯為“知識的積累”,“專家”,“行家”,是一個跨平臺的項目管理工具;
2,Maven主要用作基于Java平臺的項目(Maven本身也是Java編寫的)的構建、依賴包管理和項目信息管理;
3,Maven能提供一種項目的配置,配置好的項目,只需要運行一條簡單的命令,就能完成重復的,繁瑣的構建動作;
4,Maven能提供一種項目的依賴配置,配置好的項目,Maven能自動的從Maven的中央倉庫中幫我們下載并管理項目依賴的jar包,并且還能自動的管理這些jar包依賴的其他jar包;
5,Maven提供了一種標準的項目目錄結構,測試命名規則等項目的最佳實踐方案,統一了不同項目的學習成本(約定大于配置);
二.為什么用Maven?
IDE/Eclipse:
1,手工操作較多,編譯、測試、部署等工作都是獨立的,很難一步完成
2,每個人的IDE配置都不同,很容易出現本地代碼換個地方編譯就出錯
3,每個項目的依賴包必須自己維護了管理
Ant:
1,沒有一個約定的目錄結構
2,必須明確讓ant做什么,什么時候做,然后編譯,打包
3,沒有生命周期,必須定義目標及其實現的任務序列
4,沒有集成依賴管理
Maven的安裝
1.檢查JDK安裝的情況(需要1.6以上的版本):
添加JAVA_HOME,需要指向JDK安裝目錄;
配置CLASSPATH的:變量名:CLASSPATH。變量值:設置為.;%JAVA_HOME%/lib
添加PATH,添加%JAVA_HOME%\BIN;
2.安裝maven
設置系統環境變量,MAVEN_HOME,指向maven的根目錄
設置環境變量Path,將%MAVEN_HOME%\bin加入Path中
注意:所有標點均為英文下標點
配置成功后,在cmd中輸入mvn -v 就出現如下信息,表示配置成功
C:\Users\Administrator\Desktop>mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1;
2014-12-15T01:29:23+08:00)
Maven home: E:\javaStudy\software\maven\apache-maven-3.2.5\bin\..
Java version: 1.8.0_31, vendor: Oracle Corporation
Java home: E:\javaStudy\software\JDK
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"
maven的文件結構
bin:包含了Maven的運行腳本文件;
boot:Maven的依賴的類加載器;
conf:非常重要,Maven的全局配置文件(settings.xml),定制Maven的運行行為
lib:Maven依賴的jar包(里面的maven-model-builder-3.2.5.jar重要,后面再介紹)
.m2文件夾
運行一個maven命令:mvn help:system,觀察maven的執行動作;
在用戶的個人文件夾下,生成一個.m2文件夾,文件夾里面有一個repository文件夾,里面是剛下載的jar文件;
最佳實踐:將倉庫地址重新定位
1,將maven的conf/settings.xml拷貝到.m2中;作為個人MAVEN配置文件;
2,重新定位repository目錄地址:
Maven的簡單使用
1.hello maven項目
1)Maven規定了一套默認的項目格式:
src/main/java —— 存放項目的.java文件
src/main/resources —— 存放項目資源文件,如spring、struts2配置文件,db.properties
src/main/webapp —— 存放jsp,css,image等文件
src/test/java —— 存放所有測試.java文件,如JUnit測試類
src/test/resources —— 測試資源文件
pom.xml——主要要寫的maven配置文件
target —— 項目由maven自動輸出位置
2)按照下面的目錄結構創建一個目錄結構:
--src
-----main
----------java
-----test
----------java
--pom.xml
3)編寫下面的Java類:
(1)在src/main/java下添加類:
package cn.xmg.maven;
public class Hello {
public String sayHello(String name){
return "Hello Maven World!";
}
}
(2)在src/test/java下添加類:
package cn.xmg.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("World");
assertEquals("Hello World!",results);
}
}
4)編輯pom.xml
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">
5)切換到項目根目錄下,用cmd分別執行下列命令并觀察:
(1)執行 mvn compile命令
編譯項目
執行mvn clean命令
清空編譯好的東西
執行mvn clean compile命令
先清空后編譯
(4)執行mvn clean test命令
進行測試
(5)執行mvn clean package命令
將項目打包
(6)執行mvn clean site命令
生成文檔
執行mvn install命令
將自己的項目打包jar包并上傳到本地倉庫,上傳地址和pom.xml配置文件中相同,如下:
Maven幫我們下載的jar包的目錄和pom.xml配置文件相對應
也就是說,可以在pom.xml中配置的jar包目錄,使用自己上傳的jar包,按照這樣的格式去配置pom.xml文件。
在pom.xml配置文件中追加配置,將自己上傳的項目jar包作為jar包被引用。然后刪除cn\xmg\maven目錄下的Hello.java文件,然后重新進行測試。
能夠測試成功說明該測試已經將自己項目打包生成的jar包引用了。
使用maven很重的一點就是使用這樣的一種項目與項目間的依賴關系。
附錄:
可以通過MAVEN的命令來生成Maven項目骨架:
執行命令mvn archetype:generate
可以看到有很多的archetype,每個前面有一個序號,輸入序號(或者直接回車,選的就是quick-start):
一次輸入需要的內容,
項目創建成功
2,一次性生成
mvn archetype:create -DgroupId=[your group id] -DartifactId=[your archetype id] -DarchetypeArtifactId=maven-archetype-webapp
3,如果mvn archetype:generate列出內容過多,或者下載過慢,運行:
mvn archetype:generate -DarchetypeCatalog=internal
只列出系統內部有的archetype;
四.eclipse/myeclipse + maven
1.在myeclipse中安裝maven插件
將這三個插件文件復制到myeclipse/eclipse安裝目錄下的dropins目錄,重啟myeclipse/eclipse即可;
Maven插件基本配置
使用
導入已經存在的maven項目
新建maven項目
在工作空間: new--》others--》
Maven中一些重要概念
1.坐標:
Maven中坐標就是用來規范maven唯一標示一個構建的方法;
Maven坐標構成:
1)groupId:項目名稱
2)artifactId:項目中Maven項目/模塊名稱
3)version:項目版本
4)packing:打包的方式,比如jar、war、pom等;
5)classifier:附屬構件,比如source,javadoc等,但是注意,一般不會直接定義classifier,附加構件不是直接定義的,是插件幫助構件的;
生成的文件名是根據坐標生成的,規則:artifactId-version[-classifier].packing
在倉庫中的位置也是根據坐標生成的,后面再介紹;
2.配置依賴:
1)一個較完整的依賴配置包括
groupId:該依賴項目的groupId;
artifactId:該依賴項目的artifactId;
version:該依賴項目的版本;(也是通過這三個坐標找到jar包位置)
type:依賴項目的類型,對應坐標中的packing,即文件類型,一般不填,默認為jar;
scope:該依賴項目的依賴范圍;
optional:標記依賴是否可選;
exclusion:設置排除依賴傳遞性;
(1)scope
--》Maven在編譯,測試,運行的時候,各需要一套classpath;(比如編譯的時候會有編譯的classpath;測試的時候會有測試的classpath;)scope表明該依賴的項目和三個classpath的關系
--》scope的可選值:
1)compile:默認,綁定編譯classpath;注意,編譯classpath在編譯,測試,運行時都有效;
2)test:綁定測試classpath;
3)provided:運行時已提供;綁定編譯和測試的classpath;運行時無效;典型的如servlet-api.jar
4)runtime:測試,運行時有效;典型的如jdbc具體驅動實現;
5)import:(maven繼承中使用,不講)
--》依賴的傳遞性:
1)測試junit4.8和junit4.9的區別;并查看Junit4.9依賴項目中的pom.xml文件;
2)依賴的分類;A->B(第一直接依賴);B->C(第二直接依賴);A->C(傳遞依賴)
3)依賴的傳遞:
(第二依賴) compile ???????????????test ?????????????????provided ?????????????????runtime
(第一依賴)
compile ???????????????????????compile ????????????????N ???????????????????????????????????????????????????compile
test ?????????????????????????????test ???????????????????????N ??????????????????????????????????????????????????test
provided ?????????????????????provided ???????????????N ??????????????????provided ??????????????????provided
runtime ???????????????????????runtime ?????????????????N ???????????????????????????????????????????????????runtime
Optional
依賴的可選:可選項目不會被傳遞;
如果A項目依賴B項目;B項目依賴C或者D(比如一個基礎項目,兼容了MYSQL或者ORACLE,那么他可能依賴mysql-connector或者classes12.jar)
但是在A項目運行的時候,只需要C或者D其中一個就可以了。那么對于B項目來說,C和D項目就可以設置optional為true;在A項目中單獨設置C或者D的依賴;
Exclusion
exclusions:排除一個或多個傳遞性依賴;
傳遞性依賴可能帶來的問題:
A->B1;C->B2;那么項目中會有兩個B項目;如果包不存在沖突,那么就可以保留一個高版本的B版本即可;在A項目中:
2)最佳實踐
(1)使用properties歸類版本:
(2)依賴的分析:
mvn dependency:analyze
mvn dependency:tree
倉庫
倉庫用于統一管理和存放依賴包的地方;
倉庫中依賴包存放的方式和坐標的對應關系:groupId/artifactId/version/artifactId-version.packing
倉庫的分類:本地倉庫和遠程倉庫;組件倉庫和插件倉庫;
maven倉庫 ?—— ??本地倉庫
|—— ??遠程倉庫 ?—— ?中央倉庫
|—— 私服
|—— 其他公共庫
超級POM中:
https://repo.maven.apache.org/maven2
id:倉庫的id,只有中央倉庫id為central,倉庫的id必須唯一,如果其他倉庫id覆蓋central,則相當于覆蓋了中央倉庫;
url:倉庫的URL地址;
layout:倉庫的布局,MAVEN2以上都用default;
snapshots:代表不從中央倉庫中下載快照版本;
可以在POM中配置其他的公共倉庫;
倉庫的鏡像:如果一個倉庫完全和中央倉庫同步,我們就可以選擇本地的這種倉庫作為中央倉庫的鏡像倉庫;
在settings.xml中配置:
http://maven.net.cn/content/groups/public/
*:匹配所有的倉庫(比如配置私服)
external:*:所有遠程倉庫(localhost,file除外);
rep1,rep2:倉庫1和倉庫2;
*,!rep1:除了倉庫1其他所有的;
倉庫的搜索:
http://www.mvnrepository.com/
生命周期
Maven的生命周期是抽象的,比如當我們執行mvn clean實際上會執行一系列的動作,這些動作就是生命周期;
Maven的生命周期由多個階段構成,在Maven中有以下幾套生命周期:
1,clean(清理,對應clean):
pre-clean:執行清理前要做的事情
clean:執行清理動作
post-clean:清理后要做的事情
2,default:(構建,對應install)
validate:
initialize:初始化工作
generate-sources:
process-sources: 復制并處理資源文件,至目標目錄,準備打包。
compile: 編譯項目的源代碼。
process-classes:
generate-test-sources:
process-test-sources:復制并處理資源文件,至目標測試目錄。
test-compile:編譯測試源代碼。
process-test-classes:在測試前的工作
test:使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package:執行打包前的工作
package:接受編譯好的代碼,打包成可發布的格式,如 JAR 。
pre-integration-test:集成測試前工作;
integration-test:執行集成測試;
post-integration-test:集成測試后的工作;
verify:
install:將包安裝至本地倉庫,以讓其它項目依賴。
deploy:將最終的包復制到遠程的倉庫,以讓其它開發人員與項目共享。
3,site(站點,對應site)
pre-site:執行一些需要在生成站點文檔之前完成的工作
site:生成項目的站點文檔
post-site:執行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
site-deploy:將生成的站點文檔部署到特定的服務器上
命令行和生命周期的對應:
1,注意,命令行不是和生命周期一一對應,可能一個命令行只執行了一個生命周期的部分階段;
2,mvn clean:對應clean周期的clean之前的東西;
3,mvn test:對應default周期的test之前的階段;
4,mvn clean install:對應clean+default周期的install之前的;
注意:生命周期中不是每個階段都有事情做?。。。?!
插件目標和插件
1,Maven中只定義了生命周期,而生命周期中每個步驟怎么做,是需要插件來完成的;
2,一個插件往往能執行多個功能,插件的每一個功能,就叫做插件的目標;
3,插件綁定:插件的目標需要和生命周期中的某個階段綁定,才能完成一定的任務,插件綁定分兩種:
1)內置綁定:比如,maven-clean-plugin:clean,(比如我們可以直接執行mvn org.apache.maven.plugins:maven-clean-plugin:clean插件)
2)自定義綁定:可以通過
4,內置綁定的執行:
1,比如mvn dependency:tree,等價于執行mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree;在這里其實就可以看到groupId,artifactId,version都存在了;
2,怎么定位插件倉庫?
1,插件是單獨放在插件倉庫之中的;
2,默認的插件groupId都是org.apache.maven.plugins;
3,在插件庫中找到org\apache\maven\plugins,里面有一個maven-metadata-central.xml;
在這里就能找到artifactId;
私服
掌握nexus私服的搭建和配置;
Java Maven
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。