用了那麼久如今纔來回顧系列一:maven重學習

前言

本人從事JAVA編程已經有一些年月了(咳咳咳咳咳~喝一口茶),基本上在每次的項目開發過程當中都會使用一些集成工具,好比說Maven或是Gradle。最近在寫一個項目,可是項目在打包的過程當中出現了問題,對把MAVEN一直看成傻瓜工具來使用的我徹底不知道如何去解決這些問題。因此如今我想從新來了解一下這個工具,並用一種通俗易懂的方式來解釋這個工具的用意。html

適用人羣

本教程適用於如下兩種人:java

  1. 初次使用MAVEN可是並無心情閱讀官網上長篇教程的童鞋
  2. 已經使用過MAVEN但對其具體工做方式根本不瞭解的童鞋(如我)
  3. 資深MAVEN玩家

這裏歡迎全部人對文中的問題提出質疑,你們的意見筆者將很是珍惜!程序員

在開始以前

安裝MAVEN

MAVEN是用來做甚的?

官網上給出了六個單詞做爲MAVEN的用途,分別是web

  • Builds 構建
  • Documentation 文檔化
  • Reporting 報告
  • Dependencies 依賴管理
  • SCMs 配置管理
  • Releases 發佈管理
  • Distribution 分佈

這幾個詞乍一看來什麼都沒表述。那麼我就用一些具體的例子來講明。面試

對於初次接觸JAVA的同窗來講,在Eclipse中寫一個類,其中包含一個main方法,而後點擊一下運行鍵,就能夠將代碼運行起來。
可是,真實世界中的項目每每十分複雜,首先,一個項目會有一個開發過程的生命週期,其中和程序員緊密相關聯的步驟包括:開發,測試,集成,打包,部署。而在這些過程當中,每每須要衆多的程序員齊心合力完成,一個步驟可能有多個程序員並行的進行實現。更麻煩的是,在迭代開發過程當中,每每會產生多個版本的產品,這些版本之間既具備共同性,又具備差別性。如何才能將各個版本進行有效的管理呢?不只如此,在各個不一樣的開發時期,每每伴隨着人員的調動,一個新入組的程序員如何才能更快的對項目進行了解從而投入工做呢?apache

這就引來了一個問題,如何才能保證每一個程序員的工做成果對彼此可見,從而使每一個人之間的合做更加流暢,而不是產生衝突和冗餘編程

MAVEN就此而生。它更像是達成的某種共識。你們按照這種共識進行程序的開發。MAVEN定義了一系列開發規範,好比包的命名和功能,項目的命名等等。MAVEN中還實現了許多功能,好比自動構建,自動對依賴進行管理,自動生成項目文檔等。在MAVEN的幫助下,開發人員能夠儘量的專一於代碼的編寫,而不是去寫冗長的項目說明文檔,或是進行重複的項目構建和複雜的配置管理。微信

別廢話,先創一個MAVEN項目再說!

MAVEN本質上是一個終端工具,可是不少IDE(集成開發環境)都配有MAVEN插件,所以不少人在初次接觸MAVEN使都會使用圖形工具操做它。這樣並不有利於學習MAVEN。建議你們之後儘可能使用命令行來操控MAVEN,在熟練之後再使用圖形化工具。app

先打開終端(CMD或TERMINAL)進入項目目錄後輸出如下指令:webapp

mvn -B archetype:generate \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DgroupId=com.mycompany.app \
  -DartifactId=my-app

這個指令聲明瞭項目的名稱(artifactId),項目所屬的組織(groupId),以及項目初始化時使用的maven模板。

第一次使用MAVEN建立項目會比較慢,由於它會初始化一些內容。

clipboard.png

執行完畢後會產生以下如所示的目錄結構,其中根目錄名稱爲artifactId的值(在這裏是my-app)。
clipboard.png
具體狀況以下:
clipboard.png

在這裏咱們簡單介紹一下根目錄下各個組件的用途。
注:${basedir}是指項目的根目錄,好比在個人電腦上就是/users/rale/my-app

${basedir}/src/main/java:這個目錄下放置了項目的源代碼,其中按照初始化時groupId的屬性建好了包,每一級域名對應一個文件夾。這是MAVEN默認的建包規範。
${basedir}/src/main/java:這個目錄下放置了項目的測試代碼,而且在項目打包的時候不會被裝入包中。這個目錄底下的文件夾格式和main底下的文件夾格式相同。
pom.xml:這個文件能夠說是MAVEN的核心文件,在下面詳細說明。

初始化後的pom文件內容以下。

<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>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

在pom中包含了當前項目管理的所有信息。pom文件採用XML的格式存儲項目的配置信息(對於XML文件不熟悉的童鞋能夠自行百度,這篇文章就不詳細描述其語法了)。先簡單介紹一下上圖這個簡單的pom文件中的內容:

project: XML文件中的頂層元素
modelVersion: POM採用的模型的版本,這個元素不多改動
groupId: 開發這個項目的組織的惟一的標識號,通常採用域名的倒序
artifactId: 這個項目產品的名稱
packaging : 打包的格式
version : 打包出來的版本
name: 項目的展現名稱,一般用於MAVEN生成的文檔中
url: 項目的網址,一般用於MAVEN生成的文檔中
description: 項目的基本描述,一般用於MAVEN生成的文檔中

此時maven生成的App.java文件中有一個自動實現好的hello world實例,咱們能夠直接編譯項目並運行。
在項目的根目錄下執行mvn test,maven會自動生成對應的.class文件位於${basedir}/target/classes目錄下而且執行測試。能夠看到下圖的輸出結果中說明一共一個測試用例,而且沒有失敗的測試用例。

clipboard.png

以後使用指令mvn package打包,打包生成的文件默認路徑爲${basedir}/target

clipboard.png

至此咱們已經完成了MAVEN的最基本操做。

MAVEN的其餘騷操做

Plugin

這裏給出了添加MAVEN編譯器插件的例子。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.3</version>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

Maven中的插件能夠附着在編譯過程的不一樣的聲明週期。一共能夠分爲兩種類型的插件,一種是用於編譯的插件,一種是用於生成報告的插件。編譯的插件應當聲明於<build>模塊,而報告的插件應當聲明於<reporting/>模塊

全部的插件須要至少三個信息,groupId, artifactId和version
對於每一個插件再在本身的configuration標籤下詳細定義。
關於plugin更多內容請參考這個網址

Dependency

這裏給出了添加Junit依賴的例子

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

添加一個Dependency至少須要聲明四個屬性:groupId, artifactId, version, 和scope。其中scope是指在編譯的哪一個階段使用該依賴,其值能夠爲compile test和runtime
默認狀況下,全部的依賴文件都位於${user.home}/.m2/repository目錄下。Maven會將不在本地的依賴下載至這個目錄,而且在項目中指向這個依賴。

Plugin VS Dependency

這裏可能會對Plugin和Dependency這兩個概念之間產生一些困惑,彷佛兩者都是經過引用外部的工具完成當前項目的開發。可是這兩個實際上是徹底不一樣的兩個概念。
插件會綁定到指定的生命週期上,在特定的生命週期上觸發。咱們不會使用插件協助咱們編程。
可是依賴是指咱們會使用依賴的文件幫助開發,例如鼎鼎有名的JUnit。咱們會使用裏面的部分功能進行再次編碼開發。

如何同時編譯多個項目?

首先,咱們須要知道的是,pom文件是能夠繼承的。也就是說,咱們能夠有父pom文件和多個子pom文件。目錄格式以下:

+- pom.xml
+- my-app
| +- pom.xml
| +- src
|   +- main
|     +- java
+- my-webapp
| +- pom.xml
| +- src
|   +- main
|     +- webapp

在父pom中應當聲明以下語句,將各個模塊添加進來

<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>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>my-app</module>
    <module>my-webapp</module>
  </modules>
</project>

由於my-webapp須要my-app的依賴,所以在my-webapp/pom.xml文件中添加以下語句

<dependencies>
    <dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    ...
  </dependencies>

最後在my-webapp/pom.xml和my-app中都添加以下語句繼承父pom文件

<parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>app</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

最後在項目的總根目錄執行mvn verify能夠看到項目開始一塊兒編譯

MAVEN指令彙總

mvn archetype:create -DgroupId=packageName -DartifactId=projectName:建立一個普通的MAVEN項目
mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp : 建立一個MAVEN的web應用
mvn compile:編譯源代碼
mvn test : 執行測試
mvn test-compile: 編譯源代碼和測試代碼
mvn package: 將項目打包成 packaging標籤下聲明的格式,在這裏是JAR格式。默認狀況下,生成的JAR包位於 ${basedir}/target目錄下。
mvn compile:
mvn clean: 清除以前的編譯結果,直觀的來看就是刪除 ${basedir}/target文件夾
mvn site: 自動生成項目簡介的網站
mvn verify:運行任何檢查,驗證包是否有效且達到質量標準
本文還將持續更新~~~

clipboard.png
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~

相關文章
相關標籤/搜索