最近开始学习ssm项目,尴尬的事情发生了,一上来就遇到了maven这块绊脚石,好吧被其中的一个bug困了3天了,翻来覆去,只有把前面配置的一些东西重新搭建。发现了好多自己在前面没有配置的东西。现在把自己遇到的一些问题总结一下。
在往后的开发中,我们需要用到Maven对我们的项目进行管理以简化项目开发过程,具体就是当我们项目需要导入哪个第三方jar包时直接在Maven为我们生成的pom.xml文件中添加相关jar包依赖就行。
1.maven常用构建命令
mvn -v:查看maven的版本
mvn compile:编译项目。项目经过编译后会在根目录下生成一个target包(跟src包在同一目录下),里面保存的是编译项目时字节码文件和测试报告。
mvn test:测试。此命令在项目目录下。
mvn package:打爆我们的项目
mvn clean:删除上述经过编译后生成的target包。
mvn install:将我们的项目打包到本地仓库中。例如将A项目用该命令打包到本地仓库后,就可以在B项目的pom.xml文件中配置A项目的坐标来让B项目引用A项目。
2.maven自动构建骨架
在尝试用的IDEA开发工具为我们生成相应的骨架
mvn:表示使用的是maven命令
archetype:generate:表示使用generate这个插件为我们的maven项目自动生成一个maven骨架,
-DgroupId:标识项目的坐标元素之一,与DartifactId,Dpackaging,Dversion组成我们maven项目的坐标。
四者唯一确定一个项目。他的值为我们的项目包名。
-DartifactId:标识项目的坐标元素之一,它的值是我们的项目名。
-Dpackage:标识项目的坐标元素之一,这里值就跟DgroupId的值保持一致即可,此属性在命令行中可选。
-Dversion:指定版本号。此属性在命令行中可选
-DarchetypeArtifactId
:表示我们生成的工程结构为哪一种,这里的属性值为maven-archetype-quickstart
表示生成工程目录结构为quickstart的结构。其值还可以为maven-archetype-webapp
表示生成的工程目录结构为webapp型的结构。
3.maven中的坐标和仓库
3.1坐标
在maven的世界中,maven以构件来组成基本的控制单元,而定义这个构件的标志,maven给定义为坐标
坐标是maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件。
例如在pom.xml文件中有这样一些配置:
<groupId>cn.helloword</groupId>
<artifactId>helloword</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
上面这四个xml元素即可组成一个坐标,唯一标识我们创建的这个项目
再如若我们要在自己的项目中引入junit测试jar包,只需在pom.xml中配置如下junit的坐标:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
maven就会根据我们给出的junit的坐标在中央仓库中为我们找到junit相关的jar包,然后将其下载到本地的仓库中。这样我们便可以在自己的项目开发中运用junit类进行测试了。
3.2仓库
上述我们已经提到了仓库,其实当我们在自己的电脑上成功安装maven后,就已经生成了一个本地仓库,可以在maven文件夹下的config中的setting.xml中寻找到自己的仓库地址。一般是在*/.m2/repository的形式的文件夹下。打开之后我们发现里面全是各种引用开发的jar包。
只要我们在pom.xml中配置了相关的jar包的坐标,maven都会根据这个坐标自动将这些jar包下载在该目录下。
既然有本地仓库,那么一定有一个远程仓库喽。叫做中央仓库,地址为:https://repo.maven.apache.org/maven2
要是此时我们又创建了一个maven项目helloworld2,需要在这个项目中引用helloworld项目,只要将helloworld项目打包到本地仓库,然后在helloworld2项目的pom.xml文件中引入helloworld的坐标即可。
打开编译其中的终端。在命令行下输入
cd helloworld
mvn clean(清除helloworld经过编译后生成的target包)
mvn install(将helloworld项目打包并发布到本地仓库中)
此时,helloworld2就可以根据坐标来引入helloworld项目了。在helloworld2的pom.xml文件中添加helloworld的坐标
<dependency>
<groupId>cn.helloword</groupId>
<artifactId>helloword</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</dependency>
这样便可完成了在一个项目中对另一个项目的引用
3.3坐标和仓库的关系
有了坐标就知道在什么位置存储构件的内容,中央仓库也是一个样。
有了正确的坐标,Maven才能够在正确的位置找到依赖文件并使用,上述pom.xml中为junit坐标设置的
<scope>标签中的test值是用来控制该以来只在测试时间可用,与坐标无关。
正因为坐标是Maven核心的核心,因此规划正确的坐标至关重要,如果你使用了模糊不清的坐标,那么你的用户很难找到你的构件,即使找到了,也容易写错,错误的使用坐标,会造成冲突,那样就悲剧了。
4.生命周期和插件
Maven定义了三套生命周期:clean,default,site,每个生命周期都包含了一些阶段(phase),三套生命周期相互独立,但是各个生命周期中的phase都是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。
clean,做些清理的工作
default,最核心的周期,做初始化和构建的工作,里面分的阶段很多,主要是compllie,test,package,install等
site,生成站点的周期,包括生成文档和发布等。
maven的生命周期是抽象的,实际需要插件来完成任务,这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段来完成的,这就像设计模式里的末班模式,父类定义好了方法模板并规定对了执行顺序,而自雷定义了每个末班方法具体要做的事情,这里的父类相当于maven,而子类就像是一个个的插件。
比如compile这个阶段,对应的mvn compile这个命令,但是实际上是maven-compile-plugin这个插件在起作用。
而install这个阶段,对应的mvn install命令,实际上是maven-install-plugin这个插件在起作用。
5总结
在实际开发中,我们用到maven对我们的项目进行管理的地方,就是通过在pom.xml文件中添加所需第三方jar包的坐标让maven在中央仓库中找到相应的jar包资源后然后下载到本地仓库中为我们使用。有了maven以后,我们在使用第三方jar包时就不需要再去网上找相关的jar包进行下载及导入到path环境中,maven为我们的项目开发进行了很好的管理。