Maven基础大全及在eclipse中配置.docx
- 文档编号:8216127
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:39
- 大小:655.56KB
Maven基础大全及在eclipse中配置.docx
《Maven基础大全及在eclipse中配置.docx》由会员分享,可在线阅读,更多相关《Maven基础大全及在eclipse中配置.docx(39页珍藏版)》请在冰豆网上搜索。
Maven基础大全及在eclipse中配置
一、Maven基础介绍
Maven,发音是[`meivin],"专家"的意思。
它是一个很好的项目管理工具
1.maven不是什么
读书时候要先限定范围,避免一些有害的遐想。
要说maven不是什么,我们可以从如下几个要点来展开
1.maven不是ant,也不是make。
我们以前接触的构建工具,需要写一些详细的步骤,比如:
compileproject1/src/*.java等类似的语句。
这些语句正是我们使用ant和make所要编写的东西。
maven采用了"约定优于配置"的方法,一些开发常用的操作和步骤已经固化在maven中,所以使用者不再需要去编写那些烦人的语句了。
同时,maven内置了开发流程的支持,它不仅能够编译,同样能够打包、发布,也能够一气呵成做完这些所有的步骤。
2.maven不是ivy
依赖管理是maven的功能之一,虽然很多人包括我以前都是只用它的依赖管理功能,但是要深入运用的话,我们就可以看到更多的内容。
更重要的是,maven在依赖关系中加入了scope的概念,进一步细化了依赖关系的划分。
2.maven是什么
maven将自己定位为一个项目管理工具。
它负责管理项目开发过程中的几乎所有的东西:
1.版本
maven有自己的版本定义和规则
2.构建
maven支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
3.输出物管理
maven可以管理项目构建的产物,并将其加入到用户库中。
这个功能可以用于项目组和其他部门之间的交付行为。
4.依赖关系
maven对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为
5.文档和构建结果
maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。
6.项目关系
一个大型的项目通常有几个小项目或者模块组成,用maven可以很方便地管理
7.移植性管理
maven可以针对不同的开发场景,输出不同种类的输出结果。
3.maven的生命周期
maven把项目的构建划分为不同的生命周期(lifecycle),在我看来,划分的已经是非常仔细了,大家可以参考这里。
粗略一点的话,它这个过程(phase)包括:
编译、测试、打包、集成测试、验证、部署。
maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。
这个也是maven的一个基本调度机制。
一般来说,位置稍后的过程都会依赖于之前的过程。
当然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。
三套生命周期
Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。
以clean生命周期为例,它包含的阶段有pre-clean,clean和postclean。
当用户调用pre-clean的时候,只有pre-clean得以执行,当用户调用clean的时候,pre-clean和clean阶段会得以顺序执行;当用户调用post-clean的时候,pre-clean,clean,post-clean会得以顺序执行。
较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default生命周期的某个阶段,而不会对其他生命周期产生任何影响。
clean生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
1)pre-clean执行一些清理前需要完成的工作。
2)clean清理上一次构建生成的文件。
3)post-clean执行一些清理后需要完成的工作。
default生命周期
default生命周期定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分,它包含的阶段如下:
1)validate验证项目是否正确和所有需要的相关资源是否可用
2)initialize初始化构建
3)generate-sources
4) process-sources处理源代码
5)generate-resources
6) process-resources处理项目主资源文件。
对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
7)compile编译项目的主源代码
8)process-classes
9) generate-test-sources
10)process-test-sources处理项目测试资源文件
11)generate-test-resources
12) process-test-resources处理测试的资源文件
13)test-compile编译项目的测试代码
14)process-test-classes
15) test使用单元测试框架运行测试,测试代码不会被打包或部署
16)prepare-package做好打包的准备
17)package接受编译好的代码,打包成可发布的格式
18) pre-integration-test
19) integration-test
20) postintegration-test
21) verify
22) install将包安装到Maven本地仓库,供本地其他Maven项目使用
23)deploy将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
site生命周期
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
该生命周期包含如下阶段:
1)pre-site执行一些在生成项目站点之前需要完成的工作
2)site生成项目站点文档
3)post-site执行一些在生成项目站点之后需要完成的工作
4)site-deploy将生成的项目站点发布到服务器上
4.maven的"约定优于配置"
所谓的"约定优于配置",在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。
但是使用者除非必要,并不需要去修改那些约定内容。
maven默认的文件存放结构如下:
∙/项目目录
opom.xml用于maven的配置文件
o/src源代码目录
▪/src/main工程源代码目录
▪/src/main/java工程java源代码目录
▪/src/main/resource工程的资源目录
▪/src/test单元测试目录
▪/src/test/java
o/target输出目录,所有的输出物都存放在这个目录下
▪/target/classes编译之后的class文件
每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/java下编译所有的java文件,并把它的输出class文件存放到target/classes中。
对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重要的是,给项目引入了统一的规范。
5.maven的版本规范
maven使用如下几个要素来唯一定位某一个输出物:
groupId:
artifactId:
packaging:
version。
比如org.springframework:
spring:
2.5。
每个部分的解释如下:
∙groupId
团体,公司,小组,组织,项目,或者其它团体。
团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reversedomainname)开头。
来自Sonatype的项目有一个以com.sonatype开头的groupId,而ApacheSoftware的项目有以org.apache开头的groupId。
∙artifactId
在groupId下的表示一个单独项目的唯一标识符。
比如我们的tomcat,commons等。
不要在artifactId中包含点号(.)。
∙version
一个项目的特定版本。
发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。
而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。
虽然项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。
一个项目的groupId:
artifactId:
version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId,artifactId和version标识的项目。
∙packaging
项目的类型,默认是jar,描述了项目打包后的输出。
类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。
∙classifier
很少使用的坐标,一般都可以忽略classifiers。
如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier)。
例如,如果你想要构建两个单独的构件成JAR,一个使用Java1.4编译器,另一个使用Java6编译器,你就可以使用分类器来生成两个单独的JAR构件,它们有同样的groupId:
artifactId:
version组合。
如果你的项目使用本地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。
分类器常用于打包构件的源码,JavaDoc或者二进制集合。
maven有自己的版本规范,一般是如下定义
要说明的是,maven自己判断版本的算法是major,minor,incremental部分用数字比较,qualifier部分用字符串比较,所以要小心alpha-2和alpha-15的比较关系,最好用alpha-02的格式。
maven在版本管理时候可以使用几个特殊的字符串SNAPSHOT,LATEST,RELEASE。
比如"1.0-SNAPSHOT"。
各个部分的含义和处理逻辑如下说明:
∙SNAPSHOT
如果一个版本包含字符串"SNAPSHOT",Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC时间。
例如,"1.0-SNAPSHOT"会在2010年5月5日下午2点10分发布时候变成1.0-20100505-141000-1。
这个词只能用于开发过程中,因为一般来说,项目组都会频繁发布一些版本,最后实际发布的时候,会在这些snapshot版本中寻找一个稳定的,用于正式发布,比如1.4版本发布之前,就会有一系列的1.4-SNAPSHOT,而实际发布的1.4,也是从中拿出来的一个稳定版。
∙LATEST
指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
∙RELEASE
指最后一个发布版。
6.maven的组成部分
maven把整个maven管理的项目分为几个部分,一个部分是源代码,包括源代码本身、相关的各种资源,一个部分则是单元测试用例,另外一部分则是各种maven的插件。
对于这几个部分,maven可以独立管理他们,包括各种外部依赖关系。
7.maven的依赖管理
依赖管理一般是最吸引人使用maven的功能特性了,这个特性让开发者只需要关注代码的直接依赖,比如我们用了spring,就加入spring依赖说明就可以了,至于spring自己还依赖哪些外部的东西,maven帮我们搞定。
任意一个外部依赖说明包含如下几个要素:
groupId,artifactId,version,scope,type,optional。
其中前3个是必须的,各自含义如下:
∙groupId必须
∙artifactId必须
∙version必须。
这里的version可以用区间表达式来表示,比如(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多个条件之间用逗号分隔,比如[1,3),[5,7]。
∙scope作用域限制
∙type一般在pom引用依赖时候出现,其他时候不用
∙optional是否可选依赖
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。
在maven中,scope包含如下的取值:
∙compile(编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。
编译范围依赖在所有的classpath中可用,同时它们也会被打包。
∙provided(已提供范围)
provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。
例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的ServletAPI来编译一个servlet,但是你不会想要在打包好的WAR中包含这个ServletAPI;这个ServletAPIJAR由你的应用服务器或者servlet容器提供。
已提供范围的依赖在编译classpath(不是运行时)可用。
它们不是传递性的,也不会被打包。
∙runtime(运行时范围)
runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。
比如,你可能在编译的时候只需要JDBCAPIJAR,而只有在运行的时候才需要JDBC驱动实现。
∙test(测试范围)
test范围依赖在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
测试范围依赖在之前的?
?
?
中介绍过。
∙system(系统范围)
system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。
这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。
这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。
如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。
注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
另外,代码有代码自己的依赖,各个maven使用的插件也可以有自己的依赖关系。
依赖也可以是可选的,比如我们代码中没有任何cache依赖,但是hibernate可能要配置cache,所以该cache的依赖就是可选的。
8.多项目管理
maven的多项目管理也是非常强大的。
一般来说,maven要求同一个工程的所有子项目都放置到同一个目录下,每一个子目录代表一个项目,比如
∙总项目/
opom.xml总项目的pom配置文件
o子项目1/
▪pom.xml子项目1的pom文件
o子项目2/
▪pom.xml子项目2的pom文件
按照这种格式存放,就是继承方式,所有具体子项目的pom.xml都会继承总项目pom的内容,取值为子项目pom内容优先。
要设置继承方式,首先要在总项目的pom中加入如下配置
Xml代码
1.
2.
3.
4.
其次在每个子项目中加入
即可。
当然,继承不是唯一的配置文件共用方式,maven还支持引用方式。
引用pom的方式更简单,在依赖中加入一个type为pom的依赖即可。
Xml代码
1.
2.
3. ...
4.
5. ...
6.
7.
8.
9.
10.
11.
12.
13.
...
...
属性:
用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。
比如:
Xml代码
1.
2.
3. ...
4.
5.
6.
7.
...
maven提供了三个隐式的变量,用来访问系统环境变量、POM信息和maven的settings:
∙env
暴露操作系统的环境变量,比如env.PATH
∙project
暴露POM中的内容,用点号(.)的路径来引用POM元素的值,比如${project.artifactId}。
另外,java的系统属性比如user.dir等,也暴露在这里。
∙settings
暴露maven的settings的信息,也可以用点号(.)来引用。
maven把系统配置文件存放在maven的安装目录中,把用户相关的配置文件存放在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。
9.maven的profile
profile是maven的一个重要特性,它可以让maven能够自动适应外部的环境变化,比如同一个项目,在linux下编译linux的版本,在win下编译win的版本等。
一个项目可以设置多个profile,也可以在同一时间设置多个profile被激活(active)的。
自动激活的profile的条件可以是各种各样的设定条件,组合放置在activation节点中,也可以通过命令行直接指定。
profile包含的其他配置内容可以覆盖掉pom定义的相应值。
如果认为profile设置比较复杂,可以将所有的profiles内容移动到专门的profiles.xml文件中,不过记得和pom.xml放在一起。
activation节点中的激活条件中常见的有如下几个:
1.os
判断操作系统相关的参数,它包含如下可以自由组合的子节点元素
omessage-规则失败之后显示的消息
oarch-匹配cpu结构,常见为x86
ofamily-匹配操作系统家族,常见的取值为:
dos,mac,netware,os/2,unix,windows,win9x,os/400等
oname-匹配操作系统的名字
oversion-匹配的操作系统版本号
odisplay-检测到操作系统之后显示的信息
2.jdk
检查jdk版本,可以用区间表示。
3.property
检查属性值,本节点可以包含name和value两个子节点。
4.file
检查文件相关内容,包含两个子节点:
exists和missing,用于分别检查文件存在和不存在两种情况。
10.maven的操作和使用
maven的操作有两种方式,一种是通过mvn命令行命令,一种是使用maven的eclipse插件。
因为使用eclipse的maven插件操作起来比较容易,这里就只介绍使用mvn命令行的操作。
11.maven的配置文件
maven的主执行程序为mvn.bat,linux下为mvn.sh,这两个程序都很简单,它们的共同用途就是收集一些参数,然后用java.exe来运行maven的Main函数。
maven同样需要有配置文件,名字叫做settings.xml,它放在两个地方,一个是maven安装目录的conf目录下,对所有使用该maven的用户都起作用,我们称为主配置文件,另外一个放在%USERPROFILE%/.m2/settings.xml下,我们成为用户配置文件,只对当前用户有效,且可以覆盖主配置文件的参数内容。
还有就是项目级别的配置信息了,它存放在每一个maven管理的项目目录下,叫pom.xml,主要用于配置项目相关的一些内容,当然,如果有必要,用户也可以在pom中写一些配置,覆盖住配置文件和用户配置文件的设置参数内容。
一般来说,settings文件配置的是比如repository库路径之类的全局信息,具体可以参考官方网站的文章。
12.创建新工程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Maven 基础 大全 eclipse 配置