maven入門

圖片描述

Maven

What is Maven?

  1. 構建規範項目的工具
  2. 項目管理工具,進行打包,測試,部署
  3. 具備一套規範

POM

What is POM

  1. Maven的基本工做單元
  2. xml文件
  3. 存儲Maven項目的配置文件(Maven的命令都是先從POM讀取命令,而後執行命令)

Super POM

Maven的默認POM文件,若是POM文件沒有指定父POM文件,那麼配置都是集成Super POMjava

Minimal POM

POM文件的最低須要的配置元素:web

  1. project
  2. groupId:通常是組織名稱
  3. artifactId:項目的名稱
  4. version:項目的版本號

Maven項目的徹底限定名:
groupId:artifactId:versionapache

packaging元素默認是JAR,還有其餘選項是WAR,EAR等等

Project Inheritance

以前在Super POM一節談到指定了父POM的繼承指定父POM的配置,實現以下:app

.
 |--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,實現以下:webapp

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的父目錄,以下:maven

.
 |-- 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.測試

目錄結構ui

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

將my-module模塊聚合到my-app,修改my-app的POM文件以下:url

<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>
  1. <packaging>屬性設置未pom
  2. <module>屬性是相對於my-app的相對路徑
  1. 有些命令不能同時執行
  2. 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

  1. 編譯主代碼(便是除去測試代碼)

命令:

mvn compile
  1. 切換目錄到須要執行編譯的項目的pom.xml文件目錄下
  2. 首先Maven先去下載編譯須要的插件和依賴
  3. 將編譯的文件放在${basedir}/target/classed
  4. 編譯測試代碼

命令:

mvn test-compile
  1. 該命令不會進行測試

Test

命令:

mvn test
  1. 若是沒有執行mvn compile命令編譯,則會先進行編譯。
  2. 同時也須要下載測試須要的插件

install

咱們執行編譯的或者測試的時候會將須要依賴下載到本地倉庫(通常在${user.home}/.m2/repository)中,供咱們的項目使用。那麼咱們是否是也能夠講本身的項目給其餘項目使用呢?

  1. 先打包
  2. 後安裝

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>
  1. groupId,artifactId,version就是咱們一開始所說的項目的定位必備三項。
  2. scope表明在什麼時候使用通常有個compile(編譯),test(測試),runtime(運行)
  3. 那麼咱們引用的這些第三方的庫從哪裏下載呢?從咱們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>
相關文章
相關標籤/搜索