深入浅出Maven

1. Maven 概述

Apache Maven 是一套软件工程管理和整合工具。基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建、报告和文档。

Maven 是什么?

Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。

在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行。因为大部分的工程配置操作都非常简单并且可复用,在创建报告、检查、构建和测试自动配置时,Maven 可以让开发者的工作变得更简单。

Maven 能够帮助开发者完成以下工作:

  • 构建
  • 文档生成
  • 报告
  • 依赖
  • SCMs
  • 发布
  • 分发
  • 邮件列表

总的来说,Maven 简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven 提高了重用性,负责了大部分构建相关的任务。

Maven 的目标

Maven 的主要目的是为开发者提供

  • 一个可复用、可维护、更易理解的工程综合模型
  • 与这个模型交互的插件或者工具

Maven 工程结构和内容被定义在一个 xml 文件中 - pom.xml,是 Project Object Model (POM) 的简称,此文件是整个 Maven 系统的基础组件。详细内容请参考 Maven POM 部分。

Maven的项目结构为:

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

2. 环境配置

  1. 安装JDK并配置JAVA_HOME
  2. 下载 Maven 文件
    从以下网址下载 Maven最新版:http://maven.apache.org/download.html
  3. 解压至预定目录
  4. 设置 Maven 环境变量,添加 M2_HOME、M2、MAVEN_OPTS 到环境变量中。

Windows下:

# 使用系统属性设置环境变量。

M2_HOME=D:\apache-maven-3.2.5

M2=%M2_HOME%\bin

MAVEN_OPTS=-Xms256m -Xmx512m

添加字符串 “;%M2%” 到系统“Path”变量末尾

Linux下

# 打开命令终端设置环境变量。

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下不定期出现不识别%M2_HOME%路径,如果CMD下mvn -v始终不好使,可以将%M2_HOME%\bin替换成盘符的绝对路径。

配置 Maven_PATH\conf\settings.xml 文件,使用文本编辑器打开进行编辑(如公司已使用Maven,直接跟同事要一份覆盖自己的文件最方便快捷),自己配置的话主要就是配置几个节点:

localRepository 节点:Maven本地仓库路径(将其理解为Maven存放jar包路径即可),我在本地将其配置为

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

proxy节点:配置网络代理的,如有需要配置此节点

mirror节点:如在公司使用Maven,一般都会自己搭建私服,此节点配置私服地址(至于私服是什么可以稍后了解),如果自己用没有私服不用配置,如果想要了解更多,请到这里围观

3. 常用命令

  1. 使用 Maven 编译项目
    进入项目根目录
mvn package 

打包后,出现 BUILD SUCCESS表示成功编译成功;

  1. 使用以下命令验证该项目:
D:\test_maven_project\hello-maven>java -cp target\hello-maven-1.0-SNAPSHOT.jar c  
om.iteye.liubey.App  
  1. 创建普通项目:
mvn archetype:create -DgroupId=com.iteye.liubey -DartifactId=hello-maven -DpackageName=com.iteye.liubey  
  1. 创建WEB应用项目:
mvn archetype:create -DgroupId=com.iteye.liubey.web -DartifactId=hello-maven-webapp -DpackageName=com.iteye.liubey.web -DarchetypeArtifactId=maven-archetype-webapp
  1. 生成Eclipse项目文件:
mvn eclipse:eclipse
  1. 构建项目但不执行测试:
mvn install –Dmaven.test.skip=true
  1. 浏览依赖的项目(生成树状结构):
mvn dependency:resolve mvn dependency:tree

4. 真实项目必不可少的Profile

真实项目中,每一个项目都会有多套环境,包括开发环境,测试环境,灰度机环境以及最终的生产环境,每一套环境对应着不同的配置参数,比如JDBC连接信息肯定会有所差别,如果发布到某一环境中就需要改写一次配置文件,只有一个jdbc.properties还可以接受,想象一下真实项目中的配置文件的数量头就大,更重要的是如果写错了某参数后果将不堪设想!此时利用Maven管理的的另一个长处变显现出来了,利用Maven可以为每一个环境配置一个Profile,编译的时候指定Profile的名字即可达到编译文件按需产生。理论知识可以到这里 这里 这里 这里寻找,我就不多讲了,本身其实很简单的理论。

我将按照步骤教大家如何实现这一非常非常重要的功能。

1:更改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/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>
        <!-- 开发环境 -->
        <profile>
            <id>dev</id>
            <activation>
                <!-- 默认 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 测试环境 -->
            <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>
                        <!-- 可以运行一些命令 -->
                        <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>
        <!-- 生产环境 雷同于测试环境 -->
        <profile>
            <id>prod</id>
            <properties>
                <param>prod</param>
            </properties>
        </profile>
    </profiles>
</project>

说明: 主要是加入了资源过滤以及profile支持,我共配置了dev,test以及prod三套profile。

  1. 为了验证Profile是否生效,需做如下步骤,在src/main/resources目录下加入jdbc.properties文件,里面写入代码如下:
className=${driverName}
param=${param}

其中 ${} 格式为 Maven 编译时可替换变量,其中 driverName 为在配置文件中声明的变量, param 为在
pom.xml 中声明的变量,此处主要是展示变量可以有两种方式获取,然后再项目根目录创建 env_files 文件夹,进入 env_files 文件创建 properties 文件夹,在 properties 文件夹下建立两个文件 dev.properties
和 test.properties ,此处主要对应于 Profile 理论上将一个 Profile 对应一个 properties 文件:
dev.properties

driverName=Oracle

test.properties

driverName=MySQL
  1. 准备工作已经完成,此时切回cmd命令行窗口,输入:
# 先进入项目根目录
mvn clean -Pdev install

# 这表示执行maven命令,首先clean项目 然后使用名字为dev的Profile来install项目

出现 BUILD SUCCESS 表示项目已经编译并打包成功,进入项目的target文件夹找到 xxxxx.war 看看里面的变量是不是已经替换成这样了

# jdbc.properties文件内容

classNAME=Oracle
param=dev
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,803评论 6 342
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注释 参考 0 前言 什么是...
    seyvoue阅读 12,597评论 1 36
  • 当前,JVM生态圈主要的三大构建工具: Apache Ant(带着Ivy) Maven Gradle 对于刚开始接...
    清枫_小天阅读 5,790评论 1 13
  • 时光剪影 一片又一片的 美好回忆 都是 关于你的 身影 珍惜 那些回忆 以及藏于心底的 身影 当忘记 那定是停止了...
    丨Alice阅读 298评论 0 4