maven拾遺——一些簡單的梳理

前言

工作中maven用的最多的就是導入各種別人已經生成好的dependency或者上傳自己的api包,但是針對maven其他的一些功能似乎接觸比較少,這裏梳理一下。

之前接觸過maven的一些東西,但是這些東西都不太系統,有些maven的課程,一上來就是各種生命週期,都給整懵了,想着這玩意還是自己來總結一下吧。至於什麼是maven,這玩意完成了什麼工作,如何簡便了我們開發中jar包管理的東西,這裏就不做介紹了,直接上官網吧——maven官網

maven手動構建實例

爲了理解maven的生命週期,這裏我們開始手動構建一個簡單的maven項目

準備工作

按照maven項目管理的文件夾規範建立如下文件夾結構(maven還是一個項目週期與項目依賴管理組件,既然我們需要將項目交給maven組件去管理,就需要按照maven的規範建立項目目錄)

在這裏插入圖片描述

建好之後在src目錄下創建一個pom.xml文件

pom.xml的內容如下所示:

<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.learn.maven</groupId>
    <artifactId>HelloMaven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Hello</name>
    <!--添加依賴的jar包-->
    <dependencies>
        <!--項目要使用到junit的jar包,所以在這裏添加junit的jar包的依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

準備一個可執行的java類放置於src/main/com/learn/maven下

public class HelloMaven {

    public static void main(String[] args) {
        System.out.println("hello maven");
    }
}

編譯,清理,測試,打包

這是maven中常說的項目的週期,對應項目的幾個階段。

mvn compile 編譯

這個階段就類似於javac的操作,對源代碼進行一些編譯處理,檢查代碼是否存在語法等編譯報錯。

在這裏插入圖片描述

編譯完成之後,就會在項目的根目錄下多出一個target文件夾

在這裏插入圖片描述

裏面有我們編譯好的class文件

在這裏插入圖片描述

mvn clean 清理

clean相對而言比較簡單,從表現形式上來說就是刪除已經編譯好的文件

在這裏插入圖片描述

mvn test 測試

在src/test/com/learn/maven/下準備一個測試類,內容如下:

import org.junit.Test;
public class HelloMavenTest{

	@Test
    public void testHello(){
		System.out.println("this is maven hello test");
	}
}

mvn test 就是執行這些測試代碼,如果測試不通過,則並不會成功打包項目,在打包時可以通過 mvn package -Dmaven.test.skip=true命令跳過測試。

同樣在根目錄下執行mvn test

在這裏插入圖片描述

在target目錄中會多處如下文件夾test-classes 裏面存放着所有編譯過後的測試類文件。同時我們也看到maven也在執行測試代碼之前也幫我們編譯了代碼。

mvn package 打包

這一步是將我們的代碼打包成jar包。

在這裏插入圖片描述
打包完成之後,我們可看到在target目錄下生成了對應的jar包

在這裏插入圖片描述

默認名稱是我們的項目名+版本號。

mvn install 部署

執行mvn install命令之後maven會將我們的jar包放到maven的倉庫(我們下載的倉庫)中

在這裏插入圖片描述

進入我們的本地倉庫中,可以看到對應的文件

在這裏插入圖片描述

之後我們就可以在其他項目中引用我們的這個jar包了。

使用maven自動構建

maven給我們已經提供了很多現成的腳手架,我們可以通過mvn archetype:create或者maven archetype:generate來進行創建,如下所示

mvn archetype:generate -DgroupId=com.learn.maven.archetype -DartifactId=Selfquickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

一般格式

mvn archetype:generate -DgroupId=[自己項目的groupid] -DartifactId=[自己項目的artifactid] -DarchetypeArtifactId=[使用哪一個mavenarchetypeid構建] -DinteractiveMode=false

使用"mvn archetype:generate"命令和"mvn archetype:create"都可以創建項目,目前沒有發現這兩者的區別,唯一區別的地方就是發現使用"mvn archetype:generate"命令創建項目時要特別長的時間才能夠將項目創建好,而使用"mvn archetype:create"命令則可以很快將項目創建出來,同時使用create的項目默認是在操作系統的用戶目錄下生成。

在這裏插入圖片描述

如圖所示,是採用maven自動構建生成的項目目錄

maven的一些概念

前面我們總結了手動和自動構建maven項目的操作,這裏我們可先介紹一下maven的概念了

maven座標

我們通過groupId,artifactId,version,packaging來定位每一個maven項目

groupId——組織包名(一般是公司名稱)

artifactId——項目名稱

version——項目版本名

packaging——項目的打包方式,通常就是jar和war

maven依賴

簡單點理解maven依賴就是我們項目所依賴的一些jar包,通常在pom.xml文件中的dependenties標籤中進行管理。

依賴管理

主要通過pom文件中的dependencies標籤進行管理

<!--添加依賴的jar包-->
<dependencies>
    <!--項目要使用到junit的jar包,所以在這裏添加junit的jar包的依賴-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
        <scope>test</scope>
    </dependency>
</dependencies>

依賴範圍

依賴範圍scope用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係如下:

1.compile默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效

2.test:測試依賴範圍。只對於測試classpath有效

3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。因爲由容器已經提供,例如servlet-api

4.runtime:運行時提供。例如:jdbc驅動

至於傳遞性依賴和可選依賴,這個在後面再進行探討。

maven倉庫管理

總體來說分爲遠程倉庫,本地倉庫和私服,我們後續會嘗試搭建一個私服來管理jar包。

maven的繼承與聚合

聚合

如果想要一次構建多個項目,就需要對多個項目進行聚合。通常聚合的配置如下

  <modules>
	<module>../module01</module>
	<module>../module02</module>
  </modules>

繼承

繼承爲了消除重複,我們把很多相同的配置提取出來,已經父項目已經引用的文件

  <parent>
	  <groupId>com.learn.maven.archetype</groupId>
	  <artifactId>parent</artifactId>
	  <version>1.0.1-SNAPSHOT</version>
	  <relativePath>../parent/pom.xml</relativePath>
  </parent>

實例

我們通過mvn archetype:generate構建三個項目

mvn archetype:create -DgroupId=com.learn.maven.archetype -DartifactId=parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

mvn archetype:create -DgroupId=com.learn.maven.archetype -DartifactId=module01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

mvn archetype:create -DgroupId=com.learn.maven.archetype -DartifactId=module02 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

完成之後如下所示:

在這裏插入圖片描述

之後修改parent的pom文件,標明需要聚合的模塊

  <modules>
	<module>../module01</module>
	<module>../module02</module>
  </modules>

在兩個子項目中繼承parent

  <parent>
	  <groupId>com.learn.maven.archetype</groupId>
	  <artifactId>parent</artifactId>
	  <version>1.0.1-SNAPSHOT</version>
	  <relativePath>../parent/pom.xml</relativePath>
  </parent>

之後進入parent文件夾下對parent進行編譯,可以發現會編譯module01和module02

在這裏插入圖片描述

子模塊在引用父類模塊的依賴時,不需要指定版本號。

搭建私服

由於本地網絡原因,我私服版本被禁用了,nexus無法訪問遠程倉管,現附上一篇大牛的博客 nexus私服搭建

settings.xml文件

setting.xml文件是maven的全局配置文件,類似於我們一個web應用中的web.xml文件。同時,將settings.xml拷貝到不同用戶的倉庫目錄下,可針對不同用戶使用不同的settings.xml文件。默認情況下maven包中的settings.xml是maven的全局配置文件

下面針對settings.xml文件中的標籤來進行說明

mirror

mirrors標籤,表示配置鏡像所在的路徑的。默認的地址是國外的:https://repo.maven.apache…,maven要幫你管理jar,這些jar包下載的地址是從該地址下的,當然這個下載地址可以改變,就是通過mirrors標籤。一方面國外鏡像的地址下載速度比較慢,所以可以考慮國內鏡像的地址,比如阿里雲的。

localRepository

配置本地倉庫地址。這個在settings.xml文件中已經有示例了

<localRepository>/path/to/local/repo</localRepository>

interactiveMode

interactiveMode 標識maven是否需要和用戶交互以獲得輸入,如果maven需要和用戶交互以獲得輸入,那麼則設置成true,不然則設置爲false。

offline

offline標識maven是否需要在離線模式下運行。

pluginGroups

pluginGroups當插件的組織id(groupId)沒有顯示提供時,供搜尋插件組織Id的列表.

servers

倉庫的下載和部署是在pom.xml文件中進行定義的。比如說用戶名,密碼需要訪問遠程倉庫的時候,有時候需要安全認證,這個認證就可以配置在servers標籤中。

profiles

根據環境參數來調整構建配置的列表

pom.xml文件

三個必填字段——groupId,artifactId,version

有三個必填的字段

由groupId artifactId version所組成的就可以唯一確定一個項目

groupId標識的項目組(填寫公司的域名) 組織

artifactId項目名稱

version版本號

dependencies

這個標籤就是用來配置我們項目中具體需要哪些jar包

properties

用來定義pom中的一些屬性的

build

指定如何構建當前項目的,其中有兩個標籤

source

指定了當前構建的source目錄

plugin

指定了進行構建時使用的插件

package

指定當前構建項目的類型,war jar pom

maven 插件簡介

maven實際上是一個依賴插件執行的框架,每個人物都是由插件完成的。主要分爲兩種插件類型——build插件和 reporting插件.。

build和reporting均需要在pom.xml中進行配置,前者在構建時執行,後者在項目網站生成過程中執行。

build類型的插件需要在標籤中進行配置,如果是reporting類型的插件,需要在標籤中進行配置

maven plugin 官網介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章