首先我们得明白maven是为什么服务得?
项目开发
所以它才是一个项目管理工具,Maven可以对 Java 项目进行构建、依赖管理。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
了解maven是个项目管理工具,但是大部分开发软件都能完成项目构建和管理,为什么还要取学一个功能很多,看起来很复杂得东西了。举例下Maven可以用上得几种场景,可能会让大家更加清晰。
1、创建项目,自动关联和下载依赖的jar包
用Eclipse新建项目时,创建的只是一个空的项目,如果要加入其他框架的功能需要手动导入jar包。一般的处理方法,就是到对应的官网下载相应的jar包。这时候会存在一个疑惑,就是从官网下载下来的软件包里,包含了它所有功能的jar包,哪一些jar包有用,哪一些没用,比较笨的办法就是把所有jar包都扔到项目的lib里面。这样就造成整个项目体积庞大,增加了项目发布的I/O流量,在开发测试时,服务启动时间变长(Tomcat要在更多的jar包中去查找相应的类)。
另外一个问题就是各个jar包版本的问题,像很多框架都关联了apache的commons-lang3,commons-logging等,但不同框架的版本,对应关联的第三方jar包版本也不一样。
用Maven,就可以很好的解决jar包关联问题,比如要Struts框架,只需在pom.xml文件里,添加以下配置
<dependency>
<groupId>org.apache.strutsgroupId>
<artifactId>struts2-coreartifactId>
<version>2.3.24.1version>
dependency>
org.apache.struts struts2-core 2.3.24.1 Maven就自动的从仓库中下载相应的jar包,导入到项目中,而且它还能自动传递依赖,也就是把struts相关的jar包也导入。
2.升级框架的版本
升级某个框架的版本,但却不知道与它相关联的哪几个jar也需要跟着升级,和升级到哪个版本。用法跟上面类似,只需把版本改一下就行。
3.自动部署
项目部署到云服务器时,整个过程全是手动部署,需要的步骤有:打开eclipse,编译(如果代码有更新的话),导出war包,上传war包到云服务器上,重启tomcat。如果只是几台服务器,这样步骤还能接受,但如果有几十台,甚至上百台服务器呢?
4.项目编译打包导出
这个随意一个IDE都能做到,所以如果要Maven做这件事,可能的场景,就是做没有装IDE的环境里,比如在服务器端Linux环境下。
1.Maven坐标
一般maven使用[groupID,artifactId,version,packaging]来表示一个项目的某个版本,有时还会使用classifier来表示项目的附属构建,常见的附属构建有javadoc和sources包。
2.Maven常见的依赖范围有哪些?
compile:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。
test:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。
provided:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。
runtime:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。
system: 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。
import: 用于一个dependencyManagement对另一个dependencyManagement的继承。
4.依赖的解析机制
解析发布版本:如果本地有,直接使用本地的,没有就向远程仓库请求。
解析快照版本:合并本地和远程仓库的元数据文件-groupId/artifactId/version/maven-metadata.xml,这个文件存的版本都是带时间戳的,将最新的一个改名为不带时间戳的格式供本次编译使用。
解析版本为LATEST,RELEASE,过于复杂,且解析的结果不稳定, 不推荐在项目中使用,感兴趣的同学自己去研究,简而言之就是合并groupId/artifactId/maven-metadata.xml找到对应的最新版本和包含快照的最新版本。
5.多模块如何聚合
配置一个打包类型为pom的聚合模块,然后在该pom中使用元素声明要聚合的模块
6.对于一个多模块项目,如果管理项目依赖的版本
通过在父模块中声明dependencyManagement和pluginManagement, 然后让子模块通过元素指定父模块,这样子模块在定义依赖是就可以只定义groupId和artifactId,自动使用父模块的version,这样统一整个项目的依赖的版本。
7.一个项目的依赖来源于不同的组织,可能这些依赖还会依赖别的Jar包,如何保证这些传递依赖不会引起版本冲突。 8.常见的Maven私服的仓库类型。
使用
(宿主仓库)hosted repository, (代理仓库)proxy repository, (仓库组)group repository