深入淺出Maven

1. Maven 概述

Apache Maven 是一套軟件工程管理和整合工具?;诠こ虒ο竽P停≒OM)的概念,通過一個(gè)中央信息管理模塊,Maven 能夠管理項(xiàng)目的構(gòu)建、報(bào)告和文檔。

Maven 是什么?

Maven 是一個(gè)項(xiàng)目管理和整合工具。Maven 為開發(fā)者提供了一套完整的構(gòu)建生命周期框架。開發(fā)團(tuán)隊(duì)幾乎不用花多少時(shí)間就能夠自動(dòng)完成工程的基礎(chǔ)構(gòu)建配置,因?yàn)?Maven 使用了一個(gè)標(biāo)準(zhǔn)的目錄結(jié)構(gòu)和一個(gè)默認(rèn)的構(gòu)建生命周期。

在有多個(gè)開發(fā)團(tuán)隊(duì)環(huán)境的情況下,Maven 能夠在很短的時(shí)間內(nèi)使得每項(xiàng)工作都按照標(biāo)準(zhǔn)進(jìn)行。因?yàn)榇蟛糠值墓こ膛渲貌僮鞫挤浅:唵尾⑶铱蓮?fù)用,在創(chuàng)建報(bào)告、檢查、構(gòu)建和測試自動(dòng)配置時(shí),Maven 可以讓開發(fā)者的工作變得更簡單。

Maven 能夠幫助開發(fā)者完成以下工作:

  • 構(gòu)建
  • 文檔生成
  • 報(bào)告
  • 依賴
  • SCMs
  • 發(fā)布
  • 分發(fā)
  • 郵件列表

總的來說,Maven 簡化了工程的構(gòu)建過程,并對其標(biāo)準(zhǔn)化。它無縫銜接了編譯、發(fā)布、文檔生成、團(tuán)隊(duì)合作和其他任務(wù)。Maven 提高了重用性,負(fù)責(zé)了大部分構(gòu)建相關(guān)的任務(wù)。

Maven 的目標(biāo)

Maven 的主要目的是為開發(fā)者提供

  • 一個(gè)可復(fù)用、可維護(hù)、更易理解的工程綜合模型
  • 與這個(gè)模型交互的插件或者工具

Maven 工程結(jié)構(gòu)和內(nèi)容被定義在一個(gè) xml 文件中 - pom.xml,是 Project Object Model (POM) 的簡稱,此文件是整個(gè) Maven 系統(tǒng)的基礎(chǔ)組件。詳細(xì)內(nèi)容請參考 Maven POM 部分。

Maven的項(xiàng)目結(jié)構(gòu)為:

hello-maven
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- iteye
    |               `-- liubey
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- iteye
                    `-- liubey
                        `-- AppTest.java

2. 環(huán)境配置

  1. 安裝JDK并配置JAVA_HOME
  2. 下載 Maven 文件
    從以下網(wǎng)址下載 Maven最新版:http://maven.apache.org/download.html
  3. 解壓至預(yù)定目錄
  4. 設(shè)置 Maven 環(huán)境變量,添加 M2_HOME、M2、MAVEN_OPTS 到環(huán)境變量中。

Windows下:

# 使用系統(tǒng)屬性設(shè)置環(huán)境變量。

M2_HOME=D:\apache-maven-3.2.5

M2=%M2_HOME%\bin

MAVEN_OPTS=-Xms256m -Xmx512m

添加字符串 “;%M2%” 到系統(tǒng)“Path”變量末尾

Linux下

# 打開命令終端設(shè)置環(huán)境變量。

export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5

export M2=$M2_HOME/bin

export MAVEN_OPTS="-Xms256m -Xmx512m"

export PATH=M2:PATH

這里友情提示一下,win7下不定期出現(xiàn)不識別%M2_HOME%路徑,如果CMD下mvn -v始終不好使,可以將%M2_HOME%\bin替換成盤符的絕對路徑。

配置 Maven_PATH\conf\settings.xml 文件,使用文本編輯器打開進(jìn)行編輯(如公司已使用Maven,直接跟同事要一份覆蓋自己的文件最方便快捷),自己配置的話主要就是配置幾個(gè)節(jié)點(diǎn):

localRepository 節(jié)點(diǎn):Maven本地倉庫路徑(將其理解為Maven存放jar包路徑即可),我在本地將其配置為

<localRepository>D:\Repositories\maven</localRepository>  

proxy節(jié)點(diǎn):配置網(wǎng)絡(luò)代理的,如有需要配置此節(jié)點(diǎn)

mirror節(jié)點(diǎn):如在公司使用Maven,一般都會自己搭建私服,此節(jié)點(diǎn)配置私服地址(至于私服是什么可以稍后了解),如果自己用沒有私服不用配置,如果想要了解更多,請到這里圍觀!

3. 常用命令

  1. 使用 Maven 編譯項(xiàng)目
    進(jìn)入項(xiàng)目根目錄
mvn package 

打包后,出現(xiàn) BUILD SUCCESS表示成功編譯成功;

  1. 使用以下命令驗(yàn)證該項(xiàng)目:
D:\test_maven_project\hello-maven>java -cp target\hello-maven-1.0-SNAPSHOT.jar c  
om.iteye.liubey.App  
  1. 創(chuàng)建普通項(xiàng)目:
mvn archetype:create -DgroupId=com.iteye.liubey -DartifactId=hello-maven -DpackageName=com.iteye.liubey  
  1. 創(chuàng)建WEB應(yīng)用項(xiàng)目:
mvn archetype:create -DgroupId=com.iteye.liubey.web -DartifactId=hello-maven-webapp -DpackageName=com.iteye.liubey.web -DarchetypeArtifactId=maven-archetype-webapp
  1. 生成Eclipse項(xiàng)目文件:
mvn eclipse:eclipse
  1. 構(gòu)建項(xiàng)目但不執(zhí)行測試:
mvn install –Dmaven.test.skip=true
  1. 瀏覽依賴的項(xiàng)目(生成樹狀結(jié)構(gòu)):
mvn dependency:resolve mvn dependency:tree

4. 真實(shí)項(xiàng)目必不可少的Profile

真實(shí)項(xiàng)目中,每一個(gè)項(xiàng)目都會有多套環(huán)境,包括開發(fā)環(huán)境,測試環(huán)境,灰度機(jī)環(huán)境以及最終的生產(chǎn)環(huán)境,每一套環(huán)境對應(yīng)著不同的配置參數(shù),比如JDBC連接信息肯定會有所差別,如果發(fā)布到某一環(huán)境中就需要改寫一次配置文件,只有一個(gè)jdbc.properties還可以接受,想象一下真實(shí)項(xiàng)目中的配置文件的數(shù)量頭就大,更重要的是如果寫錯(cuò)了某參數(shù)后果將不堪設(shè)想!此時(shí)利用Maven管理的的另一個(gè)長處變顯現(xiàn)出來了,利用Maven可以為每一個(gè)環(huán)境配置一個(gè)Profile,編譯的時(shí)候指定Profile的名字即可達(dá)到編譯文件按需產(chǎn)生。理論知識可以到這里 這里 這里 這里尋找,我就不多講了,本身其實(shí)很簡單的理論。

我將按照步驟教大家如何實(shí)現(xiàn)這一非常非常重要的功能。

1:更改pom.xml,此項(xiàng)目中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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.lmsite.blog</groupId>
    <artifactId>hello-maven-web2</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>hello-maven-web2 Maven Webapp</name>
    <url>http://maven.apache.org</url>

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

    <build>
        <finalName>hello-maven-web2</finalName>
        <resources>
            <resource>
                <!--配置過濾目錄 -->
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <!-- war包插件,指引web.xml文件所在位置 -->
                <configuration>
                    <warSourceDirectory>
                        ${basedir}/src/main/webapp
                    </warSourceDirectory>
                    <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <!-- <encoding>UTF-8</encoding> -->
                    <includes>
                        <include>*.properties,*.xml</include>
                        <encoding>UTF-8</encoding>
                    </includes>
                    <excludes>
                        <exclude>*.txt</exclude>
                        <encoding>GBK</encoding>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.8</version>
                <configuration>
                    <wtpversion>2.0</wtpversion>
                    <useProjectReferences>false</useProjectReferences>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                    <systemProperties>
                        <property>
                            <name>param</name>
                            <value>${param}</value>
                        </property>
                    </systemProperties>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0-alpha-1</version>
                <executions>
                    <execution>
                        <phase>initialize</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>env_files/properties/${param}.properties</file>
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <param>dev</param>
    </properties>
    <profiles>
        <!-- 開發(fā)環(huán)境 -->
        <profile>
            <id>dev</id>
            <activation>
                <!-- 默認(rèn) -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 測試環(huán)境 -->
            <id>test</id>
            <properties>
                <param>test</param>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <configuration>
                            <warSourceDirectory>
                                ${basedir}/src/main/webapp
                            </warSourceDirectory>
                            <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml>
                        </configuration>
                    </plugin>
                    <plugin>
                        <!-- 可以運(yùn)行一些命令 -->
                        <artifactId>maven-antrun-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>1</id>
                                <phase>integration-test</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <tasks>
                                        <echo>Deploying Hello Maven Web2</echo>
                                        <!-- <exec executable="/bin/rm"> <arg value="-rf" /> <arg value="/usr/local/webapps/HelloMavenWeb2" 
                                            /> </exec> COPY WAR包并修改WAR包名稱 <exec executable="/bin/cp"> <arg value="-r" 
                                            /> <arg value="${basedir}/target/HelloMavenWeb2" /> <arg value="/usr/local/webapps/HelloMavenWeb2" 
                                            /> </exec> -->
                                        <echo>Deploy Complete</echo>
                                    </tasks>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <!-- 生產(chǎn)環(huán)境 雷同于測試環(huán)境 -->
        <profile>
            <id>prod</id>
            <properties>
                <param>prod</param>
            </properties>
        </profile>
    </profiles>
</project>

說明: 主要是加入了資源過濾以及profile支持,我共配置了dev,test以及prod三套profile。

  1. 為了驗(yàn)證Profile是否生效,需做如下步驟,在src/main/resources目錄下加入jdbc.properties文件,里面寫入代碼如下:
className=${driverName}
param=${param}

其中 ${} 格式為 Maven 編譯時(shí)可替換變量,其中 driverName 為在配置文件中聲明的變量, param 為在
pom.xml 中聲明的變量,此處主要是展示變量可以有兩種方式獲取,然后再項(xiàng)目根目錄創(chuàng)建 env_files 文件夾,進(jìn)入 env_files 文件創(chuàng)建 properties 文件夾,在 properties 文件夾下建立兩個(gè)文件 dev.properties
和 test.properties ,此處主要對應(yīng)于 Profile 理論上將一個(gè) Profile 對應(yīng)一個(gè) properties 文件:
dev.properties

driverName=Oracle

test.properties

driverName=MySQL
  1. 準(zhǔn)備工作已經(jīng)完成,此時(shí)切回cmd命令行窗口,輸入:
# 先進(jìn)入項(xiàng)目根目錄
mvn clean -Pdev install

# 這表示執(zhí)行maven命令,首先clean項(xiàng)目 然后使用名字為dev的Profile來install項(xiàng)目

出現(xiàn) BUILD SUCCESS 表示項(xiàng)目已經(jīng)編譯并打包成功,進(jìn)入項(xiàng)目的target文件夾找到 xxxxx.war 看看里面的變量是不是已經(jīng)替換成這樣了

# jdbc.properties文件內(nèi)容

classNAME=Oracle
param=dev
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,290評論 6 342
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    阿父閱讀 12,771評論 1 36
  • 當(dāng)前,JVM生態(tài)圈主要的三大構(gòu)建工具: Apache Ant(帶著Ivy) Maven Gradle 對于剛開始接...
    清楓_小天閱讀 5,996評論 1 13
  • 時(shí)光剪影 一片又一片的 美好回憶 都是 關(guān)于你的 身影 珍惜 那些回憶 以及藏于心底的 身影 當(dāng)忘記 那定是停止了...
    丨Alice閱讀 327評論 0 4

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