优点如下:
简化了项目依赖管理: 易于上手,对于新手可能一个”mvn clean package”命令就可能满足他的工作 便于与持续集成工具(jenkins)整合 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。 maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等 缺点如下:
maven是一个庞大的构建系统,学习难度大 maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
一般maven使用[groupID,artifactId,version,packaging]来表示一个项目的某个版本,有时还会使用classifier来表示项目的附属构建,常见的附属构建有javadoc和sources包。
compile:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。 test:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。 provided:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。 runtime:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。 system: 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。 import: 用于一个dependencyManagement对另一个dependencyManagement的继承。
maven有三套生命周期,分别为:
1、clean 周期:主要用于清理上一次构建产生的文件,可以理解为删除target目录 2、默认周期, 主要阶段包含:
process-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中, compile 编译src/main/java下的java文件,产生对应的class, process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中, test-compile 编译src/test/java下的java文件,产生对应的class, test 运行测试用例, package 打包构件,即生成对应的jar, war等, install将构件部署到本地仓库, deploy 部署构件到远程仓库 3、site周期
主要阶段包含
site 产生项目的站点文档 site-deploy 将项目的站点文档部署到服务器
在这个命令中我们调用了maven的clean周期的clean阶段绑定的插件任务,以及default周期的package阶段绑定的插件任务 默认执行的任务有(maven的术语叫goal, 也有人翻译成目标,我这里用任务啦):
maven-clean-plugin:clean-> maven-resources-plugin:resources-> maven-compile-plugin:compile-> mavne-resources-plugin:testResources-> maven-compile-plugin:testCompile-> maven-jar-plugin:jar
当我们输入”mvn dependency:tree”这样的指令,解析的步骤为: 解析groupID: maven使用默认的groupID:”org.apache.maven.plugins”或者”org.codehaus.mojo” 解析artifactId(maven的官方叫做插件前缀解析策略) 合并该groupId在所有仓库中的元数据库文件(maven-metadata-repository.xml),比如maven官方插件的元数据文件所在的目录为org\apache\maven\plugins,该文件下有如下的条目
<plugin> <name>Maven Dependency Plugin</name> <prefix>dependency</prefix> <artifactId>maven-dependency-plugin</artifactId> </plugin>通过比较这样的条目,我们就将该命令的artifactId解析为maven-dependency-plugin 解析version 如果你在项目的pom中声明了该插件的版本,那么直接使用该版本的插件,否则合并所有仓库中groupId/artifactId/maven-metadata-repository.xml,找到最新的发布版本。
对于非官方的插件,有如下两个方法可以选择: 1)使用groupId:artifactId:version:goal 来运行,好长~~~~~~ 2)在Settings.xml中添加pluginGroup项,这样maven不能在官方的插件库中解析到某个插件,那么就可以去你配置的group下查找啦。
配置一个打包类型为pom的聚合模块,然后在该pom中使用元素声明要聚合的模块
通过在父模块中声明dependencyManagement和pluginManagement, 然后让子模块通过元素指定父模块,这样子模块在定义依赖是就可以只定义groupId和artifactId,自动使用父模块的version,这样统一整个项目的依赖的版本。
使用
(宿主仓库)hosted repository, (代理仓库)proxy repository, (仓库组)group repository
mvn help:describe -Dplugin=groupId:artifactId