Maven
What is Maven?
- 構建規範項目的工具
- 項目管理工具,進行打包,測試,部署
- 具有一套規範
POM
What is POM
- Maven的基本工作單元
- xml文件
- 存儲Maven項目的配置文件(Maven的命令都是先從POM讀取命令,然後執行命令)
Super POM
Maven的默認POM文件,如果POM文件沒有指定父POM文件,那麼配置都是集成Super POM
Minimal POM
POM文件的最低需要的配置元素:
- project
- groupId:一般是組織名稱
- artifactId:項目的名稱
- version:項目的版本號
Maven項目的完全限定名:
groupId:artifactId:version
packaging元素默認是JAR,還有其他選項是WAR,EAR等等
Project Inheritance
之前在Super POM一節談到指定了父POM的繼承指定父POM的配置,實現如下:
.
|--my-app
| |-- my-module
| | `-- pom.xml
`-- pom.xml
my-app的POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
my-module的POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
修改my-module的POM,即可實現講my-app作爲一個父POM繼承給my-module,實現如下:
my-module的POM
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
如果my-app不是作爲my-module的父目錄,如下:
.
|-- my-module
| `-- pom.xml
`-- my-app
`-- pom.xml
需要配置<relativePath>屬性,配置相對my-module的相對路徑如下:
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-module</artifactId>
</project>
Project Aggregation
如果我們想要對一些模塊都需要執行相同的命令,但是不想進入每一個模塊下進行執行命令,可以使用Aggregation.
目錄結構
.
|-- my-module
| `-- pom.xml
`-- pom.xml
將my-module模塊聚合到my-app,修改my-app的POM文件如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
</project>
- <packaging>屬性設置未pom
- <module>屬性是相對於my-app的相對路徑
- 有些命令不能同時執行
- Inheritance和Aggregation可以混合使用
Project Interpolation and Variables
Maven的設計哲學就是不要重複自己,所以當一些配置是相同的時候,我們可以使用自己定義的變量和預定義好的變量.
比如我們要使用projcet的version給其他配置項,我們可以如此使用
<version>${project.version}</version>
我們也可以使用自己定義的變量,比如我們定義了一個mavenVersion變量,我們可以如此使用
<project>
...
<properties>
<mavenVersion>2.1</mavenVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
...
</project>
Standard Directory Layout
我們在思考Maven是什麼的時候,其中有一個理解就是Maven是一套規範,那麼這些規範體現在哪裏呢,體現在他的項目目錄的結構
目錄 | 解釋 |
---|---|
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/it | Integration Tests (primarily for plugins) |
src/assembly | Assembly descriptors |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt Notices | and attributions required by libraries that the project depends on |
README.txt | Project's readme |
Compile
- 編譯主代碼(即是除去測試代碼)
命令:
mvn compile
- 切換目錄到需要執行編譯的項目的pom.xml文件目錄下
- 首先Maven先去下載編譯需要的插件和依賴
- 將編譯的文件放在${basedir}/target/classed
- 編譯測試代碼
命令:
mvn test-compile
- 該命令不會進行測試
Test
命令:
mvn test
- 如果沒有執行mvn compile命令編譯,則會先進行編譯。
- 同時也需要下載測試需要的插件
install
我們執行編譯的或者測試的時候會將需要依賴下載到本地倉庫(一般在${user.home}/.m2/repository)中,供我們的項目使用。那麼我們是不是也可以講自己的項目給其他項目使用呢?
- 先打包
- 後安裝
Packaging
命令:
mvn packaging
該命令會將打包好的文件(如果我們在POM文件設置packaging是jar,那就打成jar包,以此類推)放在目錄${basedir}/target
Install
命令:
mvn install
surefire插件會查找項目中特定命名約定的文件
- **/*Test.java
- **/Test*.java
- **/*TestCase.java
默認排除:
- **/Abstract*Test.java
- **/Abstract*TestCase.java
Clean
命令:
mvn clean
只將${basedir}/target裏面的文件清除
External Dependencies
命令:
<dependencies>
...
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
- groupId,artifactId,version就是我們一開始所說的項目的定位必備三項。
- scope代表在何時使用一般有個compile(編譯),test(測試),runtime(運行)
- 那麼我們引用的這些第三方的庫從哪裏下載呢?從我們repository屬性配置
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>