关于Maven

来源:百度文库 编辑:神马文学网 时间:2024/07/03 13:14:25
Maven的核心对你项目构建中特定的任务几乎毫无所知。它本身不知道如何编译你的代码,
甚至不知道如何制作一个JAR文件,它把这些所有的任务交给了Maven插件。
1.Maven插件和目标(pluginId:goalId)
一个插件是一个或者多个目标的集合。
一个目标是一个明确的任务
mvn arthetype:create(arthetype表示插件,create表示目标)
-DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple
-DpackageName=org.sonatype.mavenbook
这是传入的参数,以-D开头,分别传入了groupId和artifactId,packageName等。
2.Maven生命周期
是一个项目编译的生命周期,比如:验证,测试,发布等。当Maven经过package为结尾的默认生命周期的时候,则会按照下面的生命周期执行:
resuorce:resources(复制资源到输出目录)/
compiler:compile(编译源码和其他任何配置得资源目录到输出目录)/
resource:textResource(到测试输出目录)/compiler:testCompile(到测试输出目录)/
surefire:test(运行测试)/jar:jar(把输出目录打包成JAR文件)
也可以在命令中指定步骤:mvn resuorce:resources compiler:compile。。。
3.Maven坐标

红色的部分为目标,已经标记出来。坐标就想标记一样,当需要引用或者其关联其他项目的时候,Maven通过坐标来精确定位一个项目。
Maven坐标通常用冒号来作为分隔符书写,像下面的格式:groupId:artifactId:packaging:version。比如上面可以表示为mavenbook:my-app:pachaging:version。这个符号也可以用于项目依赖。
groupId:团体的标示,比如org.apache
artifactId:在groupId下单独项目的唯一标识符
version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定版本。
Packaging:项目的类型,默认是jar。
4.Maven仓库
在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中。标准如下:

比如前面那个项目,我们就已经下载过来了junit。
5.添加依赖
添加依赖,通过dependencies


org.apache.commons
commons-io
1.3.2
test


对于只有在测试的时候用到的依赖,可以加入scope=test来表示
6..关于测试
对于测试,不用做太多的特殊操作,在test文件夹下,写好测试的类之后,只要运行mvn test。当然在运行mvn package或者mvn install的时候,你也运行了测试。
如果测试失败,你依然像产生构建输出,可以设置testFailureIgnore为true,甚至有时候你想跳过单元测试,那么可以添加skip属性,跳过。

org.apache.maven.plugins
maven-surefire-plugin

true
true


7.关于repositories和pluginRepositories

#       maven-net-cn
#       Maven China Mirror
#       http://maven.net.cn/content/groups/public/
#       
#         true
#       

#       
#         false
#       

#     


#       maven-net-cn
#       Maven China Mirror
#       http://maven.net.cn/content/groups/public/
#       
#         true
#       

#       
#         false
#       

#     

的配置,你可以在它下面添加多个 ,每个都有它唯一的ID,一个描述性的name,以及最重要的,远程仓库的url。此外,true告诉 Maven可以从这个仓库下载releases版本的构件,而false 告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。
关于的更详细的配置及相关解释,参考:http://www.sonatype.com/books /maven-book/reference_zh/apas02s08.html。
至于,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和完全一样,不再解释。
8.关于setting.xml
settings.xml对于maven来说相当于全局性的配置,用于所有的项目。在maven2中存在两个settings.xml,一个位于maven2的安装目录conf下面,作为全局性配置。对于团队设置,保持一致的定义是关键,所以maven2/conf下面的settings.xml就作为团队共同的配置文件。保证所有的团队成员都拥有相同的配置。当然对于每个成员,都需要特殊的自定义设置,如用户信息,所以另外一个settings.xml就作为本地配置
默认的仓库地址在超级pom中,我可以找到这个文件:${M2_HOME}/lib/maven-2.0.10-uber.jar ,打开该文件,能找到超级POM:\org\apache\maven\project\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置:
Xml代码 

2   
3     central
4     Maven Repository Switchboard
5     default
6     http://repo1.maven.org/maven2
7     
8       false
9     

10   

11 

可以在pom文件或者setting文件中覆盖这个选项。
9.引入sun包,比如servlet,jdbc等
你必须为所有 Sun Microsystems 维护的 J2EE API 重复同样的过程,包括 JNDI, JDBC, Servlet, JSP, JTA, 以及其它。幸运的是,有一种更简单的方法来下载所有这些类库并安装到本地仓库 —— Apache Geronimo 的独立的开源实现。
添加像 JSP API  或者 Servlet API 这样的依赖现在很简单明了了,不再需要你从 web 站点手工下载 JAR 文件然后再安装到本地仓库。 关键是你必须知道去哪里找,使用什么 groupId, artifactId, 和 version 来引用恰当的 Apache Geronimo 实现。给 pom.xml 添加如下的依赖元素以添加对 Servlet 规格说明 API 的依赖。.
Example 5.7. 添加 Servlet 2.4 规格说明作为依赖

[...]

[...]

org.apache.geronimo.specs
geronimo-servlet_2.4_spec
1.1.1
provided


[...]

所有 Apache Geronimo 规格说明的实现的 groupId 都是 org.apache.geronimo.specs 。这个 artifactId 包含了你熟悉的规格说明的版本号;例如,如果你要引入 Servlet 2.3 规格说明,你将使用的 artifactId 是 geronimo-servlet_2.3_spec ,如果你想要引入 Servlet 2.4 规格说明,那么你的 artifactId 将会是 geronimo-servlet_2.4_spec 。
10. SNAPSHOT版本、LATEST 和 RELEASE 版本
如果一个版本包含字符串“SNAPSHOT”,Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC(协调世界时)。例如,如果你的项目有个版本为“1.0-SNAPSHOT”并且你将这个项目的构件部署到了一个Maven仓库,如果你在UTC2008年2月7号下午 11:08部署了这个版本,Maven就会将这个版本展开成“1.0-20080207-230803-1”。
当你依赖于一个插件或一个依赖,你可以使用特殊的版本值LATEST或者RELEASE。LATEST是指某个特定构件最新的发布版或者快照版 (snapshot),最近被部署到某个特定仓库的构件。RELEASE是指仓库中最后的一个非快照版本。
11.使用Nexus管理仓库
仓库管理器有两个服务的目的:首先它的角色是一个高度可配置得介于你的组织与公开Maven仓库之间的代理,其次他为你的组织提供了一个可部署你组织内部生成的构建的地方。
优点:1.节省时间和带宽。2.提供一种控制Maven下载的机制。3.内部的统一依赖
组:
Nexus包含排序好的仓库组,他们能让你通过一个单独的URL暴露一系列的仓库。通常会有两个默认的组:Public Respositories组和Public Snapshot Repositorries。这样不需要知道来自哪个特定的仓库,只需要能够浏览公共仓库组就可以了。
要使用Nexus,需要配置Maven去检查Nexus而非公共的仓库,为此,需要编辑在你的.m2/setting.xml文件中的mirror配置,

这样配置以后,Maven会从本地的Nexus安装查阅,而非去外面查阅中央Maven仓库,如果对Nexus有一个构件请求,本地的Nexus安装会提供这个构件,如果Nexus没有这个构件,Nexus会从远程仓库下载,然后添加至远程仓库的本地镜像。
配置为从本地库下载:(参考1)
添加新的仓库:
在添加所有的地址包括快照版都请求向Nexus后,有可能会照成一些依赖不能下载。比如Apache Shindig,即使他的pom.xml种定义了一个仓库区获取构建,并且指向了http://google-caja.googlecode.com/svn/maven,但是,由于我们配置了所有请求都向公共组,Nexus不会从一个她=它不知道的仓库中区获取构件。这有两个方法:1.将所有请求改为central请求,不让Nexus public组mirrorof所有的仓库。2.添加新的仓库