相信很多小白和我一样,做一个SSH框架的项目之前,首先到各自的官网下载框架jar包,有用的没用的都拷到lib目录下,冲突不冲突,运行了再说,呀!控制台报错了,又百度这个错误信息来自哪几个jar包缺失或冲突,解决了这个错误,又出现了另一个错误,于是又百度....如此循环下去,项目还没正式开动,光是jar包的整合就已经让我们感受到了这个世界深深的恶意,还好开源世界的大神们为我们提供了maven这种优秀的项目管理和构建工具。
Maven介绍
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。
Maven环境搭建
首先到maven官网:maven.apache.org去下载maven,点击左侧栏目的Download进入下载页面,再点击Link是apache-maven-x.x.x-bin.zip的链接进行下载。
将下载好的压缩包进行解压,我们会发现里边包含了四个文件夹bin,boot,conf,lib。
bin目录包含了mvn的运行脚本,在windows的命令行中输入mvn就会调用这些脚本,其中m2.conf是配置文件。
boot目录包含一个类加载器的框架,maven使用它来加载自己的类库。
conf是配置文件目录。settings.xml经常用到。
lib目录下包含了maven使用时用到的所有的类库,除了maven自身的,还包含了第三方的依赖的类库。
环境变量的配置:
新建一个M2_HOME系统变量,让它指向你安装的maven路径
再编辑path环境变量,
打开cmd进行验证配置是否成功:
输入mvn -v,若能出现maven版本号,java版本号以及一些系统信息,则说明maven配置成功
Maven项目目录结构
src
-main(主代码)
-java
-package(包名)
-test(测试代码)
-java
-package(包名)
-resources(存放资源文件)
在Maven中提供了对包的新的管理方式,通过pom.xml配置文件来管理包引用。
pom.xml(存放在项目根目录下,跟src同目录):
<modelVersion>4.0.0</modelVersion> modelVersion代表的是maven的版本,4.0.0是固定的。
<groupId></groupId> groupId的值就是项目的包名。
<artifactId></artifactId> artifactId的值是模块名。
<version>0.0.1SNAPSHOT</version>
如果项目需要用到junit单元测试,就可以加入junit的依赖,即上图<dependencies></dependencies>内的内容。
实例请看:http://www.07net01.com/2016/02/1276284.html ,以"Maven项目之HelloWorld"来说明如何纯手工构建一个Maven项目.
Maven常用的构建命令(需要在cmd下到项目根目录):
mvn -v 查看maven版本
compile 编译(当出现BUILD SUCCESS这个INFO,就说明项目编译成功了,如果是第一次编译,它会在命令运行之前下载很多的第三方插件和 maven所依赖的jar。
test 测试(若项目test无误,则会在项目根目录下生成一个target文件,其中classes文件下存放着编译所生成的字节码文件。surefire- reports下存放的是生成的测试报告。)
package 打包
clean 删除target
Install 安装jar包到本地仓库
自动创建目录骨架:
archetype插件用于创建符合maven规定的目录骨架。
有两种方式:
一、在cmd下项目根目录下输入mvn archetype:generate,按照提示进行选择,他会帮我们自动创建好src和pom.xml。
二、mvn archetype:generate -DgroupId=组织名,公司网址的反写+项目名
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage=代码所存在的包
Maven中的坐标和仓库
在maven中任何一个依赖、插件、项目构建的输出都可以被称之为构件,所有的构件均通过坐标作为其唯一的标识。(groupId、artifactId、version都可以组成项目基本的坐标)
仓库分为本地仓库和远程仓库。若本地仓库中找不到需要的构件,则它回去maven的全球的中央仓库中查找,查找到之后,就会下载到我们的本地仓库中供我们使用。若远程的中央仓库也找不到,就会报错。
Maven默认提供了一个全球仓库的地址,在maven的安装文件下的lib目录下找到maven-model-builder-x.x.x.jar,将其打开,找到
org/apache/maven/model/,找到pom.4.0.0.xml.所有的maven项目都会继承这个pom。将其打开,
Url就是默认的全球中央仓库,中央仓库包含了绝大多数的开源的java项目,基本上平时做开发所用到的开源框架这里都可以找得到。
镜像仓库:
由于maven中央仓库的服务器都是位于国外的,有时因为一些原因可能导致我们没法访问外网,不过好在国内也有它的镜像仓库,这样就可以直接访问国内的镜像仓库,相对来说会更快更稳定一些。
打开maven安装文件下的conf文件,再编辑settings.xml,在146行找到mirrors标签,拷贝它的事例,并进行修改。
更改本地仓库的位置
本地仓库的位置默认是放在当前的用户目录中
一般的话不会一把仓库放在C盘,以防重装系统等其他原因丢失,所以需要更改本地仓库的位置。
在settings.xml中找到53行的localRepository标签并拷贝出来进行修改。
再将 settings.xml拷贝一份到repo目录中,这样的话,以后如果更新maven的版本,就不必再次的修改settings.xml
在Myeclipse中创建maven项目
如果装的是eclipse4.0及以上的版本或者是myeclipse,就不用再另外安装maven插件,不确定的话可以在eclipse或者myeclipse的Window-Preferences查看是否有maven选项。
Myeclipse本身已经集成maven插件,所以简单的配置下就好了。
配置完之后就可以新建maven项目了
在myeclipse中右键new-->other,在搜索框中搜索maven,然后选择Maven Project点击next再点击next。
然后会有很多的目录模板,选择quickstart,再点击next。
Finish之后打开刚刚创建的项目的pom.xml可以看到结构。
选中pom.xml右键Run As-->Maven build,可以输入命令。
比如在Goal中输入compile命令,再点击Run。
可以看到编译成功。
再输入package命令,将其进行打包,打包成功后再查看项目的根目录,可以看到它已经成功的编译出了classes文件、测试报告以及jar文件。
Maven的生命周期和插件
完整的项目构建过程包括:清理、编译、测试、打包、集成测试、验证、部署。
Maven生命周期:
clean 清理项目
pre-clean 执行清理前的工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件
default 构建项目(最核心)
compile test package install
site 生成项目站点
pre-site 在生成项目站点前要完成的工作
site 生成项目的站点文件
post-site 在生成项目站点后要完成的工作
site-deploy 发布生成的站点到服务器上
三个生命周期是相互独立的,每个生命周期都包含一些阶段,各个生命周期中的阶段却是有顺序的,且后面的阶段依赖于前面的阶段,执行某个阶段时,其前面的阶段会依次顺序执行,但不会触发另外两套生命周期中的任何的阶段。比如clean、compile、test、package、install。如果在运行package命令之前并没有运行 complie和test命令,但运行package之后,complie和test是依次执行的。
在maven的官网中提供了很多的插件:
比如source插件可以把我们的项目源码进行打包。
在pom.xml的project标签下加入如下代码。
然后右键Run As-->Maven build Goals: clean package 运行了package之后可以在控制台看到项目自动帮我们运行了编译、测试及打包。
pom.xml常用元素介绍
<project></project>是pom.xml的根元素,他包含了pom的一些约束的信息。
<modelVersion>4.0.0</modelVersion>指定了当前pom的版本,也是一个必须的元素
坐标的信息:
<groupId>反写的公司网址+项目名</groupId>
<artifactId>项目名+模块名</artifactId>
<!--第一个0 表示大版本号
第二个0表示分支版本号
第三个0表示小版本号
0.0.1
snapshot快照
alpha内部测试
beta公测
Release稳当
GA正式发布
-->
<version></version>
<!--默认是jar
war zip pom
-->
<packaging></packaging>
<!--项目描述名-->
<name></name>
<!--项目地址-->
<url></url>
<!--项目描述-->
<desceiption></description>
<!--开发人员列表-->
<developers></developers>
<!--许可证的信息-->
<licenses></licenses>
<!--组织信息-->
<organization></organization>
<!--依赖列表-->
<dependencies>
<dependency>
<!--用坐标确定依赖所在的位置-->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope>test</scope>
<!--设置依赖是否可选,默认是false,子项目默认是继承的,
如果是true,子项目必须显示的引用该依赖
-->
<optional></optional>
<!--排除依赖传递列表-->
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--依赖的管理,不会被引入到实际的依赖当中,这个标签主要是用于定义在父模块中,供子模块继承使用。比如在多个maven项目中都使用到了junit,name就可以抽象出一个父模块,在父模块中对junit进行定义,子模块继承父模块就可以了
-->
<dependencyManagement>
<dependencies>
<dependency>
</dependency>
</dependencies>
</dependencyManagement>
<!--对构件的行为提供相应的支持-->
<build>
<!--插件的列表-->
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</plugin>
</plugins>
</build>
<!--通常用于在子模块中对父模块的pom的继承-->
<parent></parent>
<!--用来聚合运行多个的maven项目-->
<modules>
<module></module>
</modules>
依赖范围
我们平时在开发时,如果要使用某一个框架,就要将该框架的jar包引入到项目的classpath路径中,这样我们的项目就可以使用该框架为我们封装好的一些方法,maven中为我们提供了三种classpath:
1、编译
2、运行
3、测试
打开官方文档
有6种scope的值:
complie:默认的范围,编译测试运行都有效
provided:在编译和测试时都有效
runtime:在测试和运行时有效
test:只在测试时有效
system:编译和测试时有效,与本机系统相关联,可移植性差
import:导入的范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置
依赖传递
比如有三个maven项目,分别是hongxin-bge,hongxin-nage,hongxin-shanji。hongxin-nage依赖于hongxin-bge,首先在nage的pom.xml中加入bge的依赖。
再对bge的pom.xml进行打包,执行clean package,这样本地仓库中就会有bge的jar文件,不然对nage进行compile的时候会报错。
同样的shanji也依赖于nage,对shanji和nage进行上述相同的操作,shanji的maven依赖就会出现了nage和bge两个依赖。这就是传递依赖。
要是想让shanji只依赖于nage,那么就用到了exclusions标签。
保存之后就可以看到bge这个依赖已经被自动去除了。
依赖冲突
举个例子,若A和B依赖了一个不同版本的相同的构件,那么对于依赖于A和B的C来说,他究竟依赖的是A和B的哪一个版本的构件。
这里有两条原则:1、短路优先(优先解析路径短的版本)
比如 A->B->C->X(jar)
A->D->X(jar)
2、先声明先优先(在路径相同的情况下,则谁先声明,先解析谁)则A会优先解析下面那个X的版本,毕竟短了一些嘛
聚合和继承
如果在maven中想把多个项目安装到本地仓库中,必须对其依次进行install。比如想安装之前的bge、nage和shanji到本地仓库,要分别对其的pom.xml进行install,三个项目还好,要是项目一多,就显得很麻烦,这个时候就可以用到聚合。我们可以创建一个聚合用的maven项目。
对其pom.xml进行修改。
然后对该聚合的pom.xml执行clean install,在控制台库发现,三个项目依次被安装到本地仓库。
我们还会发现,前面三个项目都使用了junit的依赖,所以可以新建一个新的maven项目用来继承.首先先创建一个父的maven项目,并对其pom.xml进行修改。
然后指定bge来对其进行继承,并删除pom.xml中的junit的版本号。
使用maven构建web项目
首先创建一个maven项目,这里要注意的是在Filter那边要选择webapp。
点击next之后,展开下面的Advanced然后修改其Name template为 [artifactId],不然创建出来的项目名字后面会多出Maven Webapp 。这对我等强迫症的程序员是万万不能忍的。
接下来需要检查下classes文件的输出路径,在项目上右键Build Path-->Configure Build Path。
然后点击Source,然后对几个文件的输出路径进行修改,确保它输出在target/classes下。
这样我们的web项目就创建成功了!