Maven的簡(jiǎn)介以及安裝配置和目錄結(jié)構(gòu)

1.Maven簡(jiǎn)介

1.1主要內(nèi)容

??作為Apache組織中的一個(gè)頗為成功的開源項(xiàng)目,Maven主要服務(wù)于基于java平臺(tái)的項(xiàng)目構(gòu)建,依賴管理和項(xiàng)目信息管理。

1.2.項(xiàng)目構(gòu)建

??不管你是否意識(shí)到,構(gòu)建(build)是每一位程序員每天都在做的工作。早上來(lái)到公司,我們做的第一件事就是從源碼庫(kù)簽出最新的代碼,然后進(jìn)行單元測(cè)試,如果測(cè)試失敗,會(huì)找相關(guān)的同事一起調(diào)試,修復(fù)錯(cuò)誤代碼。接著回到自己的工作上來(lái),編寫自己的單元測(cè)試及產(chǎn)品代碼。

??仔細(xì)總結(jié)一下,我們會(huì)發(fā)現(xiàn),除了編寫源代碼,我們每天有相當(dāng)一部分時(shí)間花在了編譯,運(yùn)行單元測(cè)試,生成文檔,打包和部署等繁瑣且不起眼的工作上,這就是構(gòu)建。如果我們現(xiàn)在還手工這樣做,那成本也太高了,于是有人用軟件的方法讓這一系列工作完全自動(dòng)化,使得軟件的構(gòu)建可以像全自動(dòng)流水線一樣,只需要一條簡(jiǎn)單的命令,所有繁瑣的步驟都能夠自動(dòng)完成,很快就能得到最終結(jié)果。

1.3.項(xiàng)目構(gòu)建工具

Ant構(gòu)建

??最早的構(gòu)建工具,基于IDE,大概是2000年有的,當(dāng)時(shí)是最流行java構(gòu)建工具,不過(guò)它的XML腳本編寫格式讓XML文件特別大。對(duì)工程構(gòu)建過(guò)程中的過(guò)程控制特別好。

Maven 【JAVA】

??項(xiàng)目對(duì)象模型,通過(guò)其描述信息來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件項(xiàng)目管理工具。它填補(bǔ)了Ant缺點(diǎn),Maven第一次支持了從網(wǎng)絡(luò)上下載的功能,仍然采用xml作為配置文件格式。Maven專注的是依賴管理,使用Java編寫。

Gradle

屬于結(jié)合以上兩個(gè)的優(yōu)點(diǎn),它繼承了Ant的靈活和Maven的生命周期管理,它最后被google作為了Android御用管理工具。它最大的區(qū)別是不用XML作為配置文件格式,采用了DSL格式,使得腳本更加簡(jiǎn)潔。

目前市面上Ant比較老,所以一般是一些比較傳統(tǒng)的軟件企業(yè)公司使用, Maven使用Java編寫,是當(dāng)下大多數(shù)互聯(lián)網(wǎng)公司會(huì)使用的一個(gè)構(gòu)建工具,中文文檔也比較齊全,gradle是用groovy編寫,目前比較新型的構(gòu)建工具一些初創(chuàng)互聯(lián)網(wǎng)公司會(huì)使用,以后會(huì)有很大的使用空間。

1.4.Maven的四大特性

1.4.1.依賴管理系統(tǒng)

??Maven為Java世界引入了一個(gè)新的依賴管理系統(tǒng)jar包管理 jar升級(jí)時(shí)修改配置文件即可。在Java世界中,可以用groupld、artifactld、version組成的Coordination(坐標(biāo))唯一標(biāo)識(shí)一個(gè)依賴。

??任何基于Maven構(gòu)建的項(xiàng)目自身也必須定義這三項(xiàng)屬性,生成的包可以是Jar包,也可以是war包或者jar包。—個(gè)典型的依賴引用如下所示:

<dependency>
  <groupId>javax.servlet</groupId> com. baidu
  <artifactId>javax.servlet-api</artifactId> ueditor echarts
  <version>3.1.0</version>
</dependency>

坐標(biāo)屬性的理解

??Maven坐標(biāo)為各種組件引入了秩序,任何一個(gè)組件都必須明確定義自己的坐標(biāo)。

groupld

??定義當(dāng)前Maven項(xiàng)目隸屬的實(shí)際項(xiàng)目-公司名稱。(jar包所在倉(cāng)庫(kù)路徑)由于Maven中模塊的概念,因此一個(gè)實(shí)際項(xiàng)目往往會(huì)被劃分為很多模塊。比如spring是一個(gè)實(shí)際項(xiàng)目,其對(duì)應(yīng)的Maven模塊會(huì)有很多,如spring-core,spring-webmvc等。

artifactld

??該元素定義實(shí)際項(xiàng)目中的一個(gè)Maven模塊-項(xiàng)目名,推薦的做法是使用實(shí)際項(xiàng)目名稱作為artifactld的前綴。比如: spring-bean, spring-webmvc等。

version

??該元素定義Maven項(xiàng)目當(dāng)前所處的版本。

1.4.2.多模塊構(gòu)建

??項(xiàng)目復(fù)查時(shí)dao service controller層分離將一個(gè)項(xiàng)目分解為多個(gè)模塊已經(jīng)是很通用的一種方式。

??在Maven中需要定義一個(gè)parent POM作為一組module的聚合POM。在該P(yáng)OM中可以使用<modules>標(biāo)簽來(lái)定義一組子模塊。parent POM不會(huì)有什么實(shí)際構(gòu)建產(chǎn)出。而parent POM中的build配置以及依賴配置都會(huì)自動(dòng)繼承給子module。

1.4.3.一致的項(xiàng)目結(jié)構(gòu)

??Ant時(shí)代大家創(chuàng)建Java項(xiàng)目目錄時(shí)比較隨意,然后通過(guò)Ant配置指定哪些屬于source,那些屬于testSource等。而Maven在設(shè)計(jì)之初的理念就是Conversion over configuration(約定大于配置)。其制定了一套項(xiàng)目目錄結(jié)構(gòu)作為標(biāo)準(zhǔn)的Java項(xiàng)目結(jié)構(gòu),解決不同ide帶來(lái)的文件目錄不一致問(wèn)題。

1.4.4.一致的構(gòu)建模型和插件機(jī)制

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.25</version>
    <configuration>
        <scanIntervalseconds>10</ scanIntervalseconds>
        <contextPath>/test</contextPath>
    </configuration>
</plugin>

2.1.Maven的安裝配置

2.1.1.檢查JDK的版本

??JDK版本1.7及以上版本

??win+R鍵打開終端,輸入java -version即可查看jdk版本

2.1.2.下載Maven

??下載地址:http://maven.apache.org/download.html

??歷史版本:https://maven.apache.org/docs/history.html

??下載最新版本:


2.1.3.配置Maven環(huán)境變量

??解壓后把Maven的根目錄配置到系統(tǒng)環(huán)境變量中MAVEN_HOME,將bin目錄配置到path變量中。

??注: maven解壓后存放的目錄不要包含中文和空格

??第一步,新建第一個(gè)環(huán)境變量MAVEN_HOME,如下所示:

??第二步,編輯Path變量,新增:%MAVEN_HOME%,如下所示:

??最后,驗(yàn)證是否安裝成功?,F(xiàn)在我們打開 cmd,輸入:mvn -v即可。

2.2.認(rèn)識(shí)Maven目錄結(jié)構(gòu)

Maven項(xiàng)目目錄結(jié)構(gòu)

目錄 作用
${basedir} 存放 pom.xml 和所有子目錄
${basedir}/src/main/java 項(xiàng)目的 java 源代碼所在的目錄
${basedir}/src/main/resources 項(xiàng)目的資源文件所在的目錄,例如:propert文件
${basedir}/src/test/java 測(cè)試代碼所在的目錄,例如:JUnit 代碼
${basedir}/src/test/resources 測(cè)試相關(guān)的資源文件所在的目錄
${basedir}/src/main/webapp/WEB-INF web 應(yīng)用文件目錄,web 項(xiàng)目的信息,比如存放 web.xml、本地圖片、jsp 視圖頁(yè)面
${basedir}/target 打包輸出目錄
${basedir}/target/classes 編譯輸出目錄
${basedir}/target/test-classes 測(cè)試編譯輸出目錄

2.2.1根目錄的pom.xml文件

<?xml version="1.0" encoding="utf-8"?>
<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.xxxx</groupId>
    <artifactId>maven01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>maven01</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <junit.version>5.7.0</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
</project>

標(biāo)簽定義解釋:

根目錄下的第一個(gè)子元素Modelversion指定當(dāng)前Pom模型的版本,對(duì)于Maven3來(lái)說(shuō),它只能是4.0.0。指定了當(dāng)前Maven模型的版本號(hào),對(duì)于Maven2和Maven3來(lái)說(shuō),它只能是4.0.0

groupId定義了項(xiàng)目屬于哪個(gè)組,這個(gè)組往往和項(xiàng)目所在的組織和公司存在關(guān)聯(lián)。
比如:com.xxx

artifactId定義了當(dāng)前Maven項(xiàng)目在組中唯一的ID。

version x.×.x-里程碑
比如:1.0.O-SNAPSHOT
第一個(gè)x 大版本 有重大變革
第二個(gè)x 小版本 修復(fù)bug,增加功能
第三個(gè)x 更新

里程碑版本:
SNAPSHOT(快照,開發(fā)版)
a1pha(內(nèi)部測(cè)試)
beta(公開測(cè)試)
Release | RC(發(fā)布版)
GA(正常版本)

使用name標(biāo)簽聲明一個(gè)對(duì)于用戶更為友好的項(xiàng)目名稱,雖然不是必須的,但還是推薦為每個(gè)Pom聲明name,以方便信息交流。

2.2.2編寫主函數(shù)

package com.xxxx.demo;
public class Hello{
    public static void main(String[] args){
        System.out.println("Hello maven");
    }
}

2.2.3cmd 下編譯并運(yùn)行

??注:第一次下載會(huì)比較慢,要修改maven解壓之后的conf目錄下的settings.xml。

修改配置

1.1.修改默認(rèn)倉(cāng)庫(kù)位置
打開maven目錄 -> conf -> settings.xm1添加倉(cāng)庫(kù)位置配置
<localRepository>F:/m2/ repository</localRepository>
注:倉(cāng)庫(kù)位置改為自己本機(jī)的指定目錄,"/"不要寫反

1.2.更換阿里鏡像,加快依賴下載
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

進(jìn)入項(xiàng)目的根目錄,cmd進(jìn)入終端

1.編譯java文件

??mvn compile

2.執(zhí)行main方法

??mvn exec:java -Dexec.mainClass="com.xxxx.demo.Hello"
引號(hào)里的是包名和類名

3.Maven命令

3.1.常用命令

命令 描述
mvn -version 顯示版本信息
mvn clean 清理項(xiàng)目生產(chǎn)的臨時(shí)文件,一般是模塊下的target目錄
mvn compile 編譯源代碼,一般編譯模塊下的src/main/java目錄
mvn package 項(xiàng)目打包工具,會(huì)在模塊下的target目錄生成jar或war等文件
mvn test 測(cè)試命令,或執(zhí)行src/test/java/下junit的測(cè)試用例
mvn install 將打包的jar/war文件復(fù)制到你的本地倉(cāng)庫(kù)中,供其他模塊使用
mvn deploy 將打包的文件發(fā)布到遠(yuǎn)程參考,提供其他人員進(jìn)行下載依賴
mvn site 生成項(xiàng)目相關(guān)信息的網(wǎng)站
mvn eclipse:eclipse 將項(xiàng)目轉(zhuǎn)化為Eclipse項(xiàng)目
mvn dependency:tree 打印出項(xiàng)目的整個(gè)依賴樹
mvn archetype:generate 創(chuàng)建Maven的普通java項(xiàng)目
mvn tomcat7:run 在tomcat容器中運(yùn)行web應(yīng)用
mvn jetty:run 調(diào)用Jetty插件的Run目標(biāo)在Jetty Servlet容器中啟動(dòng)web 應(yīng)用

??注意:運(yùn)行maven命令的時(shí)候,首先需要定位到maven項(xiàng)目的目錄,也就是項(xiàng)目的pom .xm1文件所在的目錄。否則,必以通過(guò)參數(shù)來(lái)指定項(xiàng)目的目錄。

3.2.命令參數(shù)

??上面列舉的只是比較通用的命令,其實(shí)很多命令都可以攜帶參數(shù)以執(zhí)行更精準(zhǔn)的任務(wù)。4.2.1.-D傳入屬性參數(shù)

例如:
mvn package -Dmaven.test.skip=true

??以-D開頭,將maven.test.skip的值設(shè)為true ,就是告訴maven打包的時(shí)候跳過(guò)單元測(cè)試。同理,mvndeploy-Dmaven.test.skip=true代表部署項(xiàng)目并跳過(guò)單元測(cè)試。

3.2.2.-P使用指定的Profile配置

比如項(xiàng)目開發(fā)需要有多個(gè)環(huán)境,一般為開發(fā),測(cè)試,預(yù)發(fā),正式4個(gè)環(huán)境,在pom.xml中的配置如下:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>dev</env>
        </properties>
        <activation>
            <activeByDefau1t>true</activeByDefault>
        </activation>
   </profile>
   <profile>
        <id>qa</id>
        <properties>
            <env>qa</env>
        </properties>
    </profile>
    <profile>
        <id>pre</id>
        <properties>
            <env>pre</env>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <env>prod</env>
        </properties>
    </profile>
</profiles>

...

<bui1d>
    <filters>
        <filter>config/${env}.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    
    ...
    
</bui1d>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容