什么是maven?
Maven是一个软件项目管理和理解工具。基于一个项目对象模型(POM)的概念,从中央信息中心,Maven管理项目的建立、报告和文档。
系统要求
JDK:
1.5或以上(这是执行maven -它仍然允许你建立对1.3和之前的JDK)。
内存:
没有最低要求。
磁盘:
没有最低要求。约100MB将用于本地存储库。
操作系统:
没有最低要求。在Windows,Windows NT以上或Cygwin是必需的
启动脚本。在Windows XP,Fedora Core和MAC OS X上测试。
安装maven
http://maven.apache.org/download.cgi下载maven,
(如果maven版本是3.3.x,JDK要求7以上)
我下的版本是3.0.5,JDK1.6,WIN7
解压maven,得到目录:
apache-maven-3.0.5/
bin
boot
conf
lib
LICENSE.txt
NOTICE.txt
README.txt
设置系统变量
MAVEN_HOME: d:\apache-maven-3.0.5
在系统变量PATH加上 ;%MAVEN_HOME%\bin,注意,一定要加分号。
可选变量,MAVEN_OPTS: -Xms256m -Xmx512m。
在命令行上输入 : mvn -version; 如看到下面信息表示安装成功
maven仓库位置
进入目录%M2_HOME%\conf,看到文件setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ~/.m2/repository-->
<localRepository>D:/apache-maven-3.0.5/repository</localRepository>
<!-- 省略。。。 -->
</settings>
maven仓库默认是在~/.m2/repository,即是系统用户目录下的.m2\repository,如win7系统的Administrator用户,则仓库是C:\Users\Administrator\.m2\repository;
如果想修改仓库位置,则修改localRepository节点的值来指定仓库位置。
建立第一个maven项目
在命令窗口下,输入命令:
mvn archetype:generate -DgroupId=com.lam.mvn.helloworld -DartifactId=helloworld -Dpackage=com.lam.mvn.helloworld -Dversion=1.0-SNAPSHOT
等一会过去,
完成:
则生成了helloworld项目,项目结构:
进入项目目录helloworld,
cd helloworld
执行:
mvn package
当你第一次运行 maven 的时候,它会从网上的 maven 库 (repository) 下载需要的程序,存放在你电脑的本地库 (local repository) 中,所以这个时候你需要有 Internet 连接。
执行完命令,在项目目录下生成target目录
执行命令:
java -cp target/helloworld-1.0-SNAPSHOT.jar com.lam.mvn.helloworld.App
好了,第一个maven项目成功了。
POM
我们看到建立的第一个项目helloworld目录下,有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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lam.mvn.helloworld</groupId>
<artifactId>helloworld</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>helloworld</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>
</project>
在 POM 中,groupId, artifactId, packaging, version 叫作 maven 坐标,它能唯一的确定一个项目。有了 maven 坐标,我们就可以用它来指定我们的项目所依赖的其他项目,插件,或者父项目。一般 maven 坐标写成如下的格式:
groupId:artifactId:packaging:version
helloworld项目就会写成:
com.lam.mvn.helloworld: helloworld: jar: 1.0-SNAPSHOT一般大项目会分成几个子项目。在这种情况下,每个子项目就会有自己的 POM 文件,然后它们会有一个共同的父项目。这样只要构建父项目就能够构建所有的子项目了。子项目的 POM 会继承父项目的 POM。另外,所有的 POM都继承了一个 Super-POM。Super-POM 设置了一些默认值,如POM可以加配置:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
maven的隐藏变量
Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和Maven Settings
env
env变量,暴露了你操作系统或者shell的环境变量。便 如在Maven POM中一个对${env.PATH}的引用将会被${PATH}环境变量替换,在Windows中为%PATH%.
projetc
project变量暴露了POM。可以使用点标记(.)的路径来引用POM元素的值- ${basedir} 项目根目录
- ${project.build.directory} 构建目录,缺省为target
- ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
- ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
- ${project.packaging} 打包类型,缺省为jar
- ${project.xxx} 当前pom文件的任意节点的内容,如${project.groupId}、${project.artifactId}。
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mymaven-core</artifactId>
<version>${project.version}</version>
</dependency>
settings
settings变量暴露了Maven settings信息。可以使用点标记(.)的路径来引用settings.xml文件中元素的值。例如${settings.offline}会引用~/.m2/settings.xml文件中offline元素的值。
使用命令:
mvn help:effective-pom
查看POM运行时的全部内容。
maven自定义常量
有时项目会有很多依赖spring的,可能有spring-core:3.1.0.RELEASE,spring-beans:3.1.0.RELEASE,spring-context:3.1.0.RELEASE,这时,我们可以定义一个常量,写依赖配置时直接用常量就OK了,这样也方便于对版本号的管理:
pom.xml:
<properties>
<!-- 自定义常量 -->
<springframework.version>3.1.0.RELEASE</springframework.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
..