项目管理利器maven学习总结

         相信很多小白和我一样,做一个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)

则A会优先解析下面那个X的版本,毕竟短了一些嘛

      2、先声明先优先(在路径相同的情况下,则谁先声明,先解析谁)

 

聚合和继承

如果在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项目就创建成功了!






















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值