Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。css
一個複雜的項目將會包含不少依賴,也有可能包含依賴於其它構件的依賴。這是Maven最強大的特徵之一,它支持了傳遞性依賴(transitive dependencies)。假如你的項目依賴於一個庫,而這個庫又依賴於五個或者十個其它的庫(就像Spring或者Hibernate那樣)。你沒必要找出全部這些依賴而後把它們寫在你的pom.xml裏,你只須要加上你直接依賴的那些庫,Maven會隱式的把這些庫間接依賴的庫也加入到你的項目中。Maven也會處理這些依賴中的衝突,同時能讓你自定義默認行爲,或者排除一些特定的傳遞性依賴。java
mvn tomcat:run
本地倉庫、遠程倉庫(私服)、中央倉庫web
本地倉庫默認爲{user.home}.m2.repority,能夠在配置文件中修改spring
核心代碼部分:src/main/java
apache
配置文件部分:src/main/resources
api
測試代碼部分:src/test/java
tomcat
測試配置文件:src/test/resources
app
頁面資源(包含js,css,圖片資源等):src/main/webapp
框架
clean:刪除項目中已經編譯好的信息,刪除target目錄dom
compile:Maven工程的編譯命令,用於編譯項目的源代碼,將src/main/java
下的文件編譯成class文件輸出到target目錄下。
test:使用合適的單元測試框架運行測試。
package:將編譯好的代碼打包成可分發的格式,如JAR,WAR。
install:安裝包至本地倉庫,以備本地的其它項目做爲依賴使用。
deploy:複製最終的包至遠程倉庫,共享給其它開發人員和項目(一般和一次正式的發佈相關)。
每個構建項目的命令都對應了maven底層一個插件。
mvn clean package依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7個階段。
mvn clean install依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8個階段。
mvn clean deploy依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9個階段。
主要區別:
package命令完成了項目編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠程maven私服倉庫。
install命令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫,但沒有佈署到遠程maven私服倉庫。
deploy命令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠程maven私服倉庫。
清理生命週期:運行mvn clean將調用清理生命週期 。
默認生命週期:是一個軟件應用程序構建過程的整體模型 。
compile,test,package,install,deploy
站點生命週期:爲一個或者一組項目生成項目文檔和報告,使用較少。
項目對象模型(Project Object Model,POM),對應着Maven項目中的pom.xml文件
項目自身信息
<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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.shangguan</groupId> <artifactId>concurrency</artifactId> <version>0.0.1-SNAPSHOT</version> <name>concurrency</name> <description>Demo project for Spring Boot</description>
項目運行所依賴的jar包信息,如:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<groupId>
:團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以建立這個項目的組織名稱的逆向域名(reverse domain name)開頭。
<artifactId>
:項目的惟一標識符
version
:項目的版本
package
:項目的類型,默認是jar,描述了項目打包後的輸出 。
項目運行環境信息,好比:jdk,tomcat信息
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
依賴範圍
compile:默認的範圍,編譯測試運行都有效。
provided:編譯和運行有效,最後在運行的時候不會加入。官方舉了一個例子。好比在JavaEE web項目中咱們須要使用servlet的API,可是Tomcat中已經提供這個jar,咱們在編譯和測試的時候須要使用這個api,可是部署到tomcat的時候,若是還加入servlet構建就會產生衝突,這個時候就可使用provided。
runtime:測試和運行有效。
test:測試有效。
system:與本機系統關聯,編譯和測試時有效。
import:導入的範圍,它只在使用dependencyManagement中,表示從其餘pom中導入dependecy的配置。
每一個顯式聲明的類包都會依賴於一些其它的隱式類包,這些隱式的類包會被maven間接引入進來,於是可能形成一個咱們不想要的類包的載入,嚴重的甚至會引發類包之間的衝突。
要解決這個問題,首先就是要查看pom.xml顯式和隱式的依賴類包,而後經過這個類包樹找出咱們不想要的依賴類包,手工將其排除在外就能夠了。 例如:
<exclusions> <exclusion> <artifactId>unitils-database</artifactId> <groupId>org.unitils</groupId> </exclusion> </exclusions>