一、Maven简介及环境搭建
1、Maven简介
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的搭建、报告和文档的软件项目管理工具。
POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。在Maven中,当谈到Project的时候,不仅仅是一堆包含代码的文件。一个Project往往包含一个配置文件,包括了与开发者有关的、缺陷跟踪系统、组织与许可、项目的URL、项目依赖、以及其他。它包含了所有与这个项目相关的东西。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。
2、Maven下载及环境配置
1)、Maven的官网:http://maven.apache.org/。
将Maven的压缩包解压之后的目录如下:
bin目录包含mvn的运行脚本,m2.conf:配置文件;
boot目录包含一个类加载器的框架,Maven使用它来加载自己的类库;
conf目录是一些配置文件;
lib目录下包含一些类库,自己运行的包括第三方的一些类库。
2)、Maven环境变量的配置:
M2_HOME变量:
PATH变量:
3)、验证环境变量是否配置成功:
命令提示符下输入:mvn -v
二、Maven的Hello world程序
1、Maven项目的目录结构
src
-main
-java
-package
-test
-java
-package
resources
2、创建项目
main和test目录下都含有java目录。
在main的java目录下,新建类包的目录结构,并编写HelloWorld.java。
package com.zxt.model;
public class HelloWorld {
public static String sayHello() {
return "Hello World!!";
}
}
在test的java目录下,新建类包的目录结构,并编写测试类HelloWorldTest.java。
package com.zxt.model;
import org.junit.*;
import org.junit.Assert.*;
public class HelloWorldTest {
@Test
public void testSayHello() {
Assert.assertEquals("Hello World!!", HelloWorld.sayHello());
}
}
3、pom.xml
创建pom.xml文件管理项目(位于项目的根目录下),pom文件的格式可以从其他项目中拷贝过来,例如spring,struts等。
4.0.0
com.zxt.model
maven01-model
0.0.1-SNAPSHOT
junit
junit
4.12
4、编译运行
在命令提示符中切换到项目目录,并使用mvn compile命令编译项目:
编译成功后,运行mvn test执行测试用例:
对项目进行打包,mvn package。
三、Maven常用的构建命令
mvn –v 查看maven版本;
compile 编译maven项目;
test 运行测试;
package 打包,maven项目;
clean 删除target文件(java源代码编译生成的二进制字节码,项目说明文档等);
install 安装jar包到本地仓库中。
1、install命令的使用实例
1)、创建类似于maven01的项目maven02。其源代码及测试代码如下:
Speak.java
package com.zxt.model02;
import com.zxt.model.HelloWorld;
public class Speak {
public static String sayHi() {
return "Hello World!!";
}
}
SpeakTest.java
package com.zxt.model;
import org.junit.*;
import org.junit.Assert.*;
public class SpeakTest {
@Test
public void testSayHi() {
Assert.assertEquals("Hello World!!", Speak.sayHello());
}
}
可以看出在Speak.java中引用了maven01项目中的HelloWorld类。这时候直接编译maven02项目,会出错:
2)、切换到maven01项目的目录下,使用mvn install命令,将maven01的jar包安装到本地仓库中,并在maven02的pom.xml文件中添加maven01的jar包依赖,再来编译maven02,则可以成功。
3)、Maven项目的jar包依赖通过
2、创建项目的两种方式
可以使用命令直接生成项目的目录结构:
1)mvn archetype:generate 按照提示进行选择,设置。
2)mvn archetype:generate –DgroupId=组织名(公司网址反写+项目名)
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage=代码所在包名
四、Maven仓库中的坐标
1、Maven项目中的依赖一般称为构件,它用Maven坐标来表示:
4.0.0
org.codehaus.mojo
my-project
1.0
上面的POM定义的是Maven2&3都承认的最小部分。groupId:artifactId:version是必须的字段(尽管在继承中groupId和version不需要明确指出)。这三个字段就像地址和邮戳,它标记了构件在仓库中的特定位置,就像Maven projects的坐标系统一样。
2、Maven的仓库分为本地仓库和中央仓库。
本地仓库默认保存在系统的用户目录的.m2目录中:C:\Users\Administrator.m2\repository。
一般情况下,我们不希望数据保存在C盘,因此可以进行本地仓库位置的修改,在Maven的conf目录下,打开settings.xml文件,找到:
取消注释,配置自己的仓库位置:
3、镜像仓库
因为Maven的中央仓库在国外,因此有可能会使用到镜像仓库,同样在settings.xml文件中进行配置:
maven.net.cn
central
central mirror in china
http://maven.net.cn/content/groups/public
4、settings.xml
此外由于settings.xml中有较多的用户设置,因此可以将它单独拿出,放到用户自己的路径中,防止Maven更新时被覆盖。
5、Maven在eclipse中的使用。
在高版本的eclipse中,默认已经有Maven的插件,不需要自己安装。因此配置好自己的Maven目录以及自定义的设置文件即可。可以在设置文件settings.xml中设置Maven使用的JDK的版本:
jdk-1.8
true
1.8
1.8
1.8
1.8
五、Maven生命周期
clean 清理项目
pre-clean执行清理前的工作
clean清理上一次构建生成的所有文件
post-clean执行清理后的文件
default 构建项目(最核心)
compile、test、package、install等.
site 生成项目站点
pre-site在生成项目站点前要完成的工作
site生成项目的站点文档
post-site在生成项目站点后要完成的工作
site-deploy发布生成的站点到服务器上
六、pom.xml文件详解
1、概览
下面是一个POM项目中的pom.xml文件中包含的元素。注意,其中的modelVersion是4.0.0,这是当前仅有的可以被Maven2&3同时支持的POM版本,它是必须的。
4.0.0
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
POM包含了一个project所需要的所有信息,当然也就包含了构建过程中所需要的插件的配置信息,事实上,这里申明了"who", "what",和"where",然而构建生命周期(build lifecycles)中说的是"when"和"how"。这并不是说POM不能影响生命周期的过程--事实上它可以。例如,配置一个可以嵌入ant任务到POM的mavem-antrun-plugin,它基本上就是一个声明,就像build.xml告诉ant当运行时它该做什么一样。一个POM声明了它自己的配置,如果外力迫使生命周期跳过了ant插件的执行,这并不影响那些已经执行过的插件产生的效果。这一点和build.xml不一样。
2、基础设置
4.0.0
com.winner.trade
trade-core
1.0.0-SNAPSHOT
jar
...
com.winner.trade
trade-test
1.0.0-SNAPSHOT
test
false
org.slf4j
slf4j-api
...
UTF-8
1.5
1.5
一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。
这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。
classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成,如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码)这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。
classifier的用途在于:
1、maven download javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件。
2、引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套:引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:
3、构建过程设置
myPorjectName
${basedir}/target
install
../filter.properties
resources
true
src/main/resources
**/*.properties
**/*.xml
jdbc.properties
maven-assembly-plugin
2.5.5
assembly
package
single
false
${finalName}
false
assembly.xml
false
...
true
${basedir}\src\main\java
${basedir}\src\main\scripts
${basedir}\src\test\java
${basedir}\target\classes
${basedir}\target\test-classes
org.apache.maven.wagon
wagon-ssh
2.8
...