mvn -v
或者 mvn -version
驗證環境變量。mvn help:system
打印出全部的系統屬性和環境變量。mvn compile
編譯項目源代碼(不會編譯test 目錄的元代)(會產生target 文件)會去中央倉庫下載項目所依賴的jar包,最後將jar 包的依賴添加classpath 路徑中。mvn test
運行應用程序中的單元測試。mvn test-compile
編譯測試代碼,compile 以後生成的targer 文件夾 主程序編譯在classes 文件夾下面,測試程序代碼放在test-classes 文件夾下。mvn clean
刪除target 文件夾。mvn install
安裝項目依賴的jar 到本地倉庫中。mvn clean compile test
組合使用mvn clean install
html
conf/settings.xml
修改:java
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> -->
推薦不要去修改maven 安裝目錄下的conf/settings.xml (全局),建議拷貝settings.xml 到對應的本地倉庫目錄下面(默認:%USERPROFILE%\.m2/settings.xml
),存放路徑: groupId+artifactId(com.cashew.maven+maven-demo1) 即comcashewmavenmaven-demo1。apache
settings.xml詳解tomcat
咱們mvn compile
的時候maven會去本地倉庫查找是否有對應的jar(依賴),若是沒有默認會去maven 中央倉庫進行下載,Downloading:https://repo.maven.apache.org/maven2/junit/junit/xxx
maven 的中央遠程倉庫地址是 lib/maven-model-builder-3.3.9.jar
中pom-4.0.0.xml文件:服務器
<!--倉庫列表--> <repositories> <repository> <!--中央倉庫的物理標識--> <id>central</id> <!-倉庫的名稱---> <name>Central Repository</name> <!-- 連接的url --> <url>https://repo.maven.apache.org/maven2</url> <!--默認路徑--> <layout>default</layout> <!--禁止下載 snapshot --> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
也能夠在項目的pom.xml文件中配置其餘中央倉庫地址:maven
<repositories> <repository> <!-- Maven 自帶的中央倉庫使用的Id爲central 若是其餘的倉庫聲明也是用該Id 就會覆蓋中央倉庫的配置 --> <id>mvnrepository</id> <name>mvnrepository</name> <url>https://mvnrepository.com/</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
maven中央倉庫服務器是在國外的,本身若要配置國內的倉庫鏡像,在setttings.xml中設置:ide
<mirrors> <!-- mirror | Specifies a repository mirror site to use instead of a given repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique across the set of mirrors. | <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://my.repository.com/repo/path</url> </mirror> --> <!--配置國內的阿里雲服務器鏡像--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <!-- 表明了一個鏡像的替代位置,例如central就表示代替官方的中央庫 --> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
設置多個鏡像只會識別第一個鏡像下載jar包。配置的多個mirror能夠都放着不影響,選取一個鏡像下載比較快的放在第一個就行。單元測試
src --main --java --package --resources --test --java --package --resources
pom.xml src/main/java 項目的源代碼所在目錄 src/main/resources 項目的資源文件所在的目錄 src/test/java 測試代碼所在的目錄 src/test/resources 測試相關的資源文件所在的目錄 pom.xml 項目工程的描述文件 classes文件夾在target裏
第一種:ui
mvn archetype:generate
選擇817,maven將提供 maven-archetype-quickstart骨架
再輸入groupId、artifactId、version、package(與groupId同)
第二種:
mvn archetype:generate -DgroupId=com.cashew.maven -DartifactId=maven-demo -Dversion=1.0.0-SNAPSHOT -Dpackage=com.cashew.maven
第三種:
mvn archetype:crawl
會在本地倉庫目錄下生成archetype-catalog.xml,移動到.m2目錄,配置參數,執行:
mvn archetype:generate -DarchetypeCatalog=local
<?xml version="1.0" encoding="UTF-8"?> <!-- START SNIPPET: superpom --> <project> <!-- 指定當前pom 的版本--> <modelVersion>4.0.0</modelVersion> <!-- 項目包名: 公司地址名稱反寫+項目名稱--> <groupId>com.cashew.maven</groupId> <!--項目模塊名稱:通常爲 項目名-模塊名 --> <artifactId>maven-demo1</artifactId> <!-- 標識當前項目版本號 第一個.號以前的數字標識 表示大版本號 第二個.號以前的數字標識 表示分支版本號 第三個.號以前的數字標識 表示小版本號 SNAPSHOT:快照版本 Release 發佈版本 Alpha :內部測試版本 GA:正式發佈的版本 --> <version>1.0.0SNAPSHOT</version> <dependencies> <!-- 在maven 的世界中 任何一個依賴、插件以及項目構建的輸出均可以成爲構件 而構件又是經過座標進行惟一標識的。 官網提供的jar 是否是不少,而且隨着版本升級會有不一樣版本的jar maven 是如何快速的定位獲取對於可能給的jar,就是經過座標的思想來實現的座標由那些元素構成? 1. groupId 2. artifactId 3. version 4. packaging: zip war jar (默認) 5. classifer --> <!-- maven 是經過dependency 進行依賴的描述 dependcy 是經過座標元素groupId、artifactId、version 來進行快速定位的,咱們同時也知道一個項目會有引用多個依賴(jar),因此又爲dependency指定一個dependencies 的容器 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> </dependencies> <build> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <executions> <execution> <phase>package</phase> <goals> <!--指定mvn package時執行tomcat插件--> <goal>run</goal> </goals> </execution> </executions> </plugin> </build> </project> <!-- END SNIPPET: superpom -->
maven 提供三種classpath : 編譯、測試、運行這三種classpath 都是有效。compile
:對於編在編測試、運行這三種classpath 都是有效test
: 測試依賴範圍有效,在編譯和運行項目的時候沒法使用此類的依賴(典型的junit);provided
: 對編譯、測試 classpath 有效,對運行時無效(典型的serlvet);runtime
: 運行時的依賴範圍,對測試和運行有效,在編譯源代碼無效(典型案例:JDBC的驅動實現);system
: 系統的依賴範圍,使用system範圍的依賴的時候必須經過systemPath 元素顯示指定依賴文件的路徑,不依賴於maven倉庫解析,因此可能會形成構建不可移植,慎用!
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
employee 依賴manager, manager依賴boss
employee 經過傳遞 間接也依賴於boss,排除對boss的依賴:
<dependency> <groupId>com.cashew.maven</groupId> <artifactId>company-manager</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.cashew.maven</groupId> <artifactId>company-boss</artifactId> </exclusion> </exclusions> </dependency>
employee --->manager(commons-io 2.0)--->boss(commons-io 2.4)
1.短路優先
A--->B--->C---D(1.0.jar)
A--->B--->C(2.0.jar)
A只會有2.0的包
2.相同路徑的時候 先聲明先使用
employee--->manager
employee--->boss
manager先聲明,則A只會有2.0的包
maven 是以模塊的概念進行項目描述的。
現有A、B、C多個模塊的過程,須要聚合到一塊兒,能夠新建一個聚合工程,在該工程的pom.xml中配置:
<packaging>pom</packaging>
並添加模塊依賴列表
<modules> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
能夠將多個模塊工程的一些共性依賴進行向上的抽取,並組成maven父工程。
如:employee 、manager、boss都有junit 依賴,那麼能夠單獨的去定義一個maven項目封裝這些共性的依賴,稱爲父類 maven項目。在該工程的pom.xml中配置:
<packaging>pom</packaging>
使用dependencyManagement 元素來提供一種管理依賴版本號的方式,讓所在在子項目中引用一個依賴而不用顯示的列出版本號,maven 會沿着父子層次向上走,直到找到使用dependencyManagement的元素的項目 而後它就會使用dependencyManagement 元素的指定的版本號:
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
父工程不須要運行,刪除src/test/java
子模塊工程要繼承父工程,添加:
<parent> <groupId>com.cashew.maven</groupId> <artifactId>company-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
修改對應的依賴:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependencies>
好處:若是有多個子項目都引用都一個依賴,則可避免在每一個使用的子項目中都聲明一個版本號,當升級或者切換版本的時候,只須要在頂層父容器裏更新便可。