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. 环境配置
- 安装JDK并配置JAVA_HOME
- 下载 Maven 文件
从以下网址下载 Maven最新版:http://maven.apache.org/download.html - 解压至预定目录
- 设置 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. 常用命令
- 使用 Maven 编译项目
进入项目根目录
mvn package
打包后,出现 BUILD SUCCESS
表示成功编译成功;
- 使用以下命令验证该项目:
D:\test_maven_project\hello-maven>java -cp target\hello-maven-1.0-SNAPSHOT.jar c
om.iteye.liubey.App
- 创建普通项目:
mvn archetype:create -DgroupId=com.iteye.liubey -DartifactId=hello-maven -DpackageName=com.iteye.liubey
- 创建WEB应用项目:
mvn archetype:create -DgroupId=com.iteye.liubey.web -DartifactId=hello-maven-webapp -DpackageName=com.iteye.liubey.web -DarchetypeArtifactId=maven-archetype-webapp
- 生成Eclipse项目文件:
mvn eclipse:eclipse
- 构建项目但不执行测试:
mvn install –Dmaven.test.skip=true
- 浏览依赖的项目(生成树状结构):
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。
- 为了验证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
- 准备工作已经完成,此时切回cmd命令行窗口,输入:
# 先进入项目根目录
mvn clean -Pdev install
# 这表示执行maven命令,首先clean项目 然后使用名字为dev的Profile来install项目
出现 BUILD SUCCESS
表示项目已经编译并打包成功,进入项目的target文件夹找到 xxxxx.war
看看里面的变量是不是已经替换成这样了
# jdbc.properties文件内容
classNAME=Oracle
param=dev