一、maven的介紹
maven是一個項目構建和jar包依賴的管理工具。
二、使用maven的優勢
①可以幫助我們構建項目,從驗證,編譯,測試,打包,檢查,安裝,部署一整套服務都會提供。
②可以幫助我們管理jar包的依賴和依賴關系。
三、maven知識點總結
1.maven的基本命令
mvn clean:清理,將根目錄下面的target目錄清理掉;
mvn compile:編譯,將項目中的.java文件編譯成.class文件;
mvn test:測試,執行項目下src/test/java下的命名為Xxx...Test.java文件的單元測試類;
mvn package:打包,將項目打包放置在項目根目錄.target下;
mvn install:安裝,將項目打包到自己本地環境;
mvn deploy:部署,將項目部署到我們的私服環境;
mvn package -DskipTest:打包跳過測試;
mvn dependency:tree:查看依賴的樹形結構,用於依賴沖突排除;
mvn install:install-file "-Dfile=jar包完整地址或相對地址" "-DgroupId=自定義的groupID" "-DartifactId=自定義的artifactid" "-Dversion=自定義版本號" "-Dpackaging=jar" 將已有jar打包到本地倉庫;
mvn deploy:deploy-file -Dfile=jar包 -DgroupId=groupID -DartifactId=artifacid -Dversion=版本號 -Dpackaging=jar -Durl=http://ip:port/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty :將本地已有的jar打包到私服;
2.maven的生命周期
2.1清理生命周期
pre-clean:執行清理前需要完成的工作
clean:清理上一次構建生成的文件
post-clean:執行清理后需要完成的工作
2.2默認生命周期
validate:驗證工程是否正確,所有需要的資源是否可用。
compile:編譯項目的源代碼。
test:使用合適的單元測試框架來測試已編譯的源代碼。這些測試不需要已打包和布署。
package:把已編譯的代碼打包成可發布的格式,比如jar。
verify:運行所有檢查,驗證包是否有效且達到質量標准。
install:把包安裝到maven本地倉庫,可以被其他工程作為依賴來使用。
deploy:在集成或者發布環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
2.3站點生命周期
pre-site:生成項目站點(war)前工作
site:生成項目站點(war)
post-site:打包后工作
site-deploy:按照pom.xml配置把生成的項目站點部署到服務器上
3.依賴的范圍
Maven在編譯主代碼的時候需要使用一套classpath,在編譯和執行測試的時候會使用另一套classpath,實際運行項目的時候,又會使用一套classpath。 依賴范圍就是用來控制依賴與這三種classpath(編譯classpath、測試classpath、運行classpath)的關系,
Maven有以下幾種依賴范圍:
依賴范圍 |
對於編譯的classPath |
對於測試的calssPath |
對於運行的classPath |
示例 |
Compile |
Y |
Y |
Y |
spring-core |
Test |
|
Y |
|
Junit |
Provided |
Y |
Y |
|
servlet-api |
Runtime |
|
Y |
Y |
JDBC驅動
|
compile:如果沒有指定,就會默認使用該依賴范圍,對於編譯、測試、運行三種classpath都有效。
test: 只對於測試classpath有效。
provided: 對於編譯和測試classpath有效,但在運行時無效。
runtime: 對於測試和運行classpath有效。
4.依賴傳遞
直接依賴\間接依賴 |
Compile |
Test |
Provided |
Runtime |
Compile |
Compile |
|
|
Runtime |
Test |
Test |
|
|
Test |
Provided |
Provided |
|
Provided |
Provided |
Runtime |
Runtime |
|
|
Runtime |
當有A,B,C;A依賴B,B依賴C;A與C就產生依賴傳遞;
如圖:直接依賴於間接依賴的關系;示例:
如果我們A只是依賴B的某一功能,但並不想引入C中的某一jar,可以設置scop為provided;根據我們對第一點的分析provided會對編譯的classPath和測試的classPath有效但在運行時無效不會打包到lib文件夾;
圖解:直接依賴是Compile,間接依賴是provided時,該jar的依賴范圍是provide;
5.打包插件:maven-source-plugin
- <plugin>
- <artifactId>maven-source-plugin</artifactId> //插件名
- <version>2.4</version> //版本
- <configuration>
- <attach>true</attach> //attach參數指定是否將java源附加到項目的工件列表。
- </configuration>
- <executions>
- <execution>
- <phase>package</phase> //執行命令
- <goals>
- <goal>jar-no-fork</goal> //直接執行打包操作,沒有前面的生命周期
- </goals>
- </execution>
- </executions>
- </plugin>
四、總結
在實際開發中使用的maven的場景會非常多,比如每次編碼完成之后,編寫了眾多的測試類,可以自己單元進行測試,也可以使用maven命令進行整體測試;
在項目迭代中只要修改pom版本號就可以清楚進行版本的迭代;
如果我們寫一個項目需要供組內小伙伴使用我們可以將我們寫的項目部署到私服上就可以共享了;
項目的依賴也是非常重要的,尤其是scope的定義,當我們不需要傳遞依賴的時候最好設置成provider,這樣會縮小打包的大小;
項目依賴沖突,可以參考一種的樹結構查看命令,然后進行排除就可以了。