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 POM

Minimal POM

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

  1. project
  2. groupId:一般是組織名稱
  3. artifactId:項目的名稱
  4. 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>
  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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章