一、Maven概述
1.什么是Maven?
Maven中文意思是"行家"、"专家",它是一种跨平台的项目管理工具。
2.Maven有什么作用?
Maven能够实现基于Java平台的项目构建、依赖管理和项目信息管理。
3.什么是理想的项目构建?
高度自动化,跨平台,可重用组件,符合标准化的规范
4.什么是依赖,为什么要进行依赖管理?
自动下载,统一依赖管理,方便项目升级和修改
5.项目信息包括哪些内容?
项目名称描述、开发人员信息、开发者信息等。
Maven官方下载地址:http://maven.apache.org/download.cgi
Eclipse插件更新地址:http://www.eclipse.org/m2e/
安装过程见官方文档说明:http://maven.apache.org/install.html、http://maven.apache.org/configure.html
二、Ant比较Maven
Ant和Maven都是apache下的工程,在早些时候,Ant非常流行,像是spring框架和hibernate框架都使用了该项目管理工具进行项目的构建,但是现在到他们的官网上查看项目结构,可以看出,他们都已经使用Maven管理最新的项目了,为了实现过渡,中间曾经出现过Maven和Ant共存的情况,这样倒是方便了用户的选择,但是现在这种情况已经没有了,或者说极少出现了,现在各大公司都直接使用Maven管理项目而抛弃了Ant。
1.Ant的劣势
(1)没有一个约定的目录结构
(2)必须明确让Ant做什么,什么时候做,然后编译、打包
(3)没有生命周期,必须定义目标和其实现的任务序列
(4)没有继承依赖管理
2.Maven取代Ant的优势
(1)拥有约定的目录结构,不需要配置Maven就知道你的代码放到了哪里
(2)拥有一个生命周期,比如使用命令mvn install就可以自动执行编译、测试、打包、安装到Maven仓库等过程
(3)拥有依赖管理、仓库管理
三、Maven的配置
1.两种settings.xml配置文件
* MAVEN_HOME/conf/settings.xml,这是全局的配置文件
* ~/.m2/settings.xml配,这是单个用户的配置文件
2.Maven约定的目录结构
项目文件夹
|------src
|------main
|------java //存放项目的java文件
|------resources //存放项目资源文件,如spring、hibernate的配置文件
|------test
|------java //存放所有测试的java文件
|------resources //存放测试需要的资源文件,如spring、hibernate的配置文件
|------target //存放项目生成的目标代码、资源文件等
|------pom.xml //项目核心配置文件
3.pom.xml配置文件中的标签讲解
详细配制方法见英文文档:http://maven.apache.org/pom.html
POM是"Project Object Model"的英文缩写,
(1)一个完整的pom.xml配置文件的格式如下:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 4 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <!-- The Basics --> 8 <groupId>...</groupId> 9 <artifactId>...</artifactId> 10 <version>...</version> 11 <packaging>...</packaging> 12 <dependencies>...</dependencies> 13 <parent>...</parent> 14 <dependencyManagement>...</dependencyManagement> 15 <modules>...</modules> 16 <properties>...</properties> 17 18 <!-- Build Settings --> 19 <build>...</build> 20 <reporting>...</reporting> 21 22 <!-- More Project Information --> 23 <name>...</name> 24 <description>...</description> 25 <url>...</url> 26 <inceptionYear>...</inceptionYear> 27 <licenses>...</licenses> 28 <organization>...</organization> 29 <developers>...</developers> 30 <contributors>...</contributors> 31 32 <!-- Environment Settings --> 33 <issueManagement>...</issueManagement> 34 <ciManagement>...</ciManagement> 35 <mailingLists>...</mailingLists> 36 <scm>...</scm> 37 <prerequisites>...</prerequisites> 38 <repositories>...</repositories> 39 <pluginRepositories>...</pluginRepositories> 40 <distributionManagement>...</distributionManagement> 41 <profiles>...</profiles> 42 </project>
(2)最简单的配置文件格式:
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.kdyzm.hello</groupId> 4 <artifactId>Hello</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <name>Hello</name> 7 8 <dependencies> 9 <dependency> 10 <groupId>junit</groupId> 11 <artifactId>junit</artifactId> 12 <version>4.9</version> 13 <scope>test</scope> 14 </dependency> 15 16 </dependencies> 17 </project>
根节点必须是project标签;
modelVersion标志了POM的版本,maven2和maven3只支持4.0.0,而且该声明是必须的;
groupId、artifactId、version是maven坐标组成的三大元素,这就涉及到了什么是maven坐标的问题;
坐标,按照以前的理解,是用于唯一确定空间中某一点的度量,这里坐标有着相同的含义,它用来唯一标识一个项目,具体到某一个版本号,groupId、artifactId、version三个元素共同确定一个唯一的项目,它就像一个地址或者时间戳一样,一个项目使用它标识自己在maven库中的独一无二的位置。
groupId:一般使用类似于com.kdyzm.main这种域名的形式来表示,体现在maven系统中,就是java包结构一样的东西,这个字段不需要非得用这种形式,但是使用这种形式更加清晰,就像maven,它的工程都放到了以org.apache.maven为groupId的文件夹中,体现在maven仓库,其实就是org/apache/maven
artifacted:代表了工程的名字,不需要和真实的工程名字相一致,但是强烈推荐一致,方便记忆,不容易出错。
version:版本号
package:决定如果执行mvn package命令的话需要将项目生成的文件打包成什么样的类型,支持的类型如下:
pom, jar, maven-plugin, ejb, war, ear, rar, par.
dependencies:该标签的作用就是声明依赖的项目或者jar包,每一个依赖都是用dependendy标签来单独声明,声明的内容除了使用groupId、artifactId和version定位项目之外,还要有一个scope标签用来指定作用范围,其作用和java中的注解有些相似;理解这个需要先搞定maven项目的构建过程:
scope的所有支持类型:
compile:编译时有效,作用在上图中的编译阶段
test:测试时有效,作用在上图中的测试阶段
runtime:运行时有效,作用在测试阶段和以后的阶段
provided:顾名思义,当该项目运行的容器中提供了该jar包的时候(测试运行的时候没有该环境),需要将该依赖声明为provided,这样jar包就不会拷贝到运行的容器中了,这样能够防止jar包冲突问题的发生。
system:其作用和provided类似,但是需要除去一点,该jar包在本地maven库中不存在(有疑问)。
四、maven项目的生命周期
什么是生命周期?从创建到死亡的过程就是生命周期,一个比较完整的声明周期如下:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
maven能够实现高度的自动化,当我们执行mvn compile命令的时候,其生命周期之前的命令都会依次执行一遍;同理,当我们执行mvn test命令的时候,包括mvn compile命令在内,其之前的命令都会依次执行一遍。
五、两个简单项目的练习
1.Hello项目,以下是maven项目的实际结构示意图
Hello
|------src
|------main
|------java
|------com/kdyzm/main/Hello.java
|------resources
|------test
|------java
|------com/kdyzm/main/test/HelloTest.java
|------resources
|------target
|------pom.xml
1 package com.kdyzm.main; 2 public class Hello 3 { 4 public int calculate(int input){ 5 System.out.println("得到输入参数是:"+input); 6 return input*input; 7 } 8 }
1 package com.kdyzm.main.test; 2 3 import org.junit.Test; 4 import com.kdyzm.main.Hello; 5 public class HelloTest 6 { 7 @Test 8 public void testHello(){ 9 Hello hello=new Hello(); 10 int result=hello.calculate(2); 11 System.out.println("计算得到的结果是:"+result); 12 } 13 }
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.kdyzm.hello</groupId> 4 <artifactId>Hello</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <name>Hello</name> 7 8 <dependencies> 9 <dependency> 10 <groupId>junit</groupId> 11 <artifactId>junit</artifactId> 12 <version>4.9</version> 13 <scope>test</scope> 14 </dependency> 15 16 </dependencies> 17 </project>
使用maven命令进行管理:
- mvn compile 该命令能够将源代码编译,生成的class文件保存到了target文件夹中。
- mvn clean 该命令能够将target文件夹删除掉
- mvn clean test 该命令是一个组合命令,它能够先执行mvn clean命令,再执行mvn test命令
- mvn package 该命令是一个打包的命令,根据配置文件的不同,它会将生成的文件打包成不同的类型
- mvn install 该命令会先将项目打包,之后再将相关的jar包和配置文件拷贝到maven仓库中
- mvn clean install 该命令也是一个组合命令,它能够先执行mvn clean命令,然后执行mvn install命令
2.HelloFriend项目
HelloFriend
|------src
|------main
|------java
|------com/kdyzm/main/HelloFriend.java
|------resources
|------test
|------java
|------com/kdyzm/main/test/HelloFriendTest.java
|------resources
|------target
|------pom.xml
1 package com.kdyzm.main; 2 import com.kdyzm.main.Hello; 3 public class HelloFriend{ 4 public String sayHello(int input){ 5 System.out.println("HelloFriend类sayHello方法接收到的参数是:"+input); 6 Hello hello = new Hello(); 7 int result=hello.calculate(input); 8 return result+""; 9 } 10 }
1 package com.kdyzm.main.test; 2 import com.kdyzm.main.HelloFriend; 3 import org.junit.Test; 4 public class HelloFriendTest 5 { 6 @Test 7 public void testSayHello(){ 8 HelloFriend helloFriend=new HelloFriend(); 9 String result=helloFriend.sayHello(2); 10 System.out.println("testSayHello的执行结果是:"+result); 11 } 12 }
<!--pom.xml配置文件-->
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.kdyzm.hello</groupId> 4 <artifactId>HelloFriend</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <name>HelloFriend</name> 7 8 <dependencies> 9 <dependency> 10 <groupId>junit</groupId> 11 <artifactId>junit</artifactId> 12 <version>4.9</version> 13 <scope>test</scope> 14 </dependency> 15 16 <dependency> 17 <groupId>com.kdyzm.hello</groupId> 18 <artifactId>Hello</artifactId> 19 <version>0.0.1-SNAPSHOT</version> 20 <scope>compile</scope> 21 </dependency> 22 23 </dependencies> 24 </project>
六、maven仓库
当执行完成mvn install命令的时候,打包成jar的项目和相关配置文件就会保存到maven仓库中以便于向其他项目提供依赖,保存的目录是:~/.m2/repository/$groupId/$artifactId
例如以上两个项目执行完成mvn install命令之后,如果没有错误,那么在我电脑对应的目录上就会出现一下文件和目录: