1.Maven介绍
相信很多人都已经对它已经有了或多或少的了解,这里给一个专业的定义:
Maven是标准、存储格式以及一些软件用以管理和描述项目。它为构建、测试、部署项目定义了一个标准的生命周期。它提供了一个框架,允许遵循Maven标准的所有项目,方便的重用公用的构建逻辑。Maven项目存在的Apache软件基金会,是一个开源社区,它开发的软件工具,基于一个通用的软件对象模型(Project Object Model),也就是POM。
在此之前,大多数人还在使用ant做为项目的构建工具,憾的是,Ant 的项目管理工具(作为 make
的替代工具)不能满足绝大多数开发人员的需要。通过检查 Ant 构建文件,很难发现项目的相关性信息和其它元信息(如开发人员/拥有者、版本或站点主页)。Maven 除了以程序构建能力为特色之外,还提供 Ant 所缺少的高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目,而使用 Ant 则需要十几行。事实上,由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目现在使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
2.Maven与ant的比较
Maven vs Ant
那么,Maven 和 Ant 有什么不同呢?在回答这个问题以前,我要强调一点:Maven 和 Ant 针对构建问题的两个不同方面。Ant 为 Java 技术开发项目提供跨平台构建任务。Maven 本身描述项目的高级方面,它从 Ant 借用了绝大多数构建任务。因此,由于 Maven 和 Ant 代表两个差异很大的工具,所以我将只说明这两个工具的等同组件之间的区别,如表下表格 所示:
Maven | Ant | |
标准构建文件 | project.xml 和 maven.xml | build.xml |
特性处理顺序 |
最后一个定义起决定作用。 |
第一个定义最先被处理。 |
构建规则 | 构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。 | 构建规则或多或少是静态的,除非使用
|
3.Maven的安装部署
maven的官方网址:http://maven.apache.org/
下载地址:http://maven.apache.org/download.html,目前的最新版本是3.0.4
本文章的环境为:windows7旗舰版32位、maven2.2.1、jdk1.6.0_14
安装步骤:
- 在D盘创建maven目录(根据自己情况来定);
- 在D:\maven目录下创建mavenRepository目录;
- 将下载的maven安装包解压缩到D:\maven目录下,整个目录看起来如下图所示:
- 在操作系统中增加环境变量,分别添加:M2_HOME=d:\maven\maven,在PATH中添加%M2_HOME%\bin;
很简单,就这几步就安装完了,验证一下是否安装成功,在命令行窗口中输入:mvn -version,能打印出版本信息即安装成功。
4.Maven仓库
刚才在上一章节中,我们创建了mavenRepository目录,这个目录我们作为本地仓库来存储相关的maven构建。
如何让它生效呢?
在maven安装成功后,在操作系统的当前用户目录下,有maven的配置文件,以我自己机器为例,路径是:C:\Users\xieyf\.m2\settings.xml,打开该文件,找到localRepository标签,修改里边的路径为:<localRepository>d:/maven/mavenRepository/</localRepository>
到此为止,maven在本地的安装就完成了,下边章节我们继续讨论maven如何使用。
上一篇文章(maven(一)——maven的介绍与安装),我们介绍了maven的相关基础知识和如何在本地安装部署maven。今天,我们来讨论下如何在Myeclipse环境中通过maven来管理和配置项目,以及如何在tomcat中部署并发布、打包项目。
其实最原始的方法,maven通过命令行就可以来创建、配置、运行、发布、打包项目,咱们这次先不讲命令行的方式,直接说在Myeclipse中来操作。因为目前对于我们开发者来说,绝大多数还是在IDE(包括Myeclipse等)中来操作的。
好,废话不说,开始正文
先说一下我的环境:Myeclipse8.5,Jdk1.6.0_14,maven2.2.1
1.Myeclipse安装maven插件
很高兴的看到,Myeclipse本身已经内置了maven的插件,咱们就不需要单独安装了,唯一需要修改的是Myeclipse中使用的maven版本,不管Myeclipse使用的是哪个版本,咱们都统一改成刚才下载到本地安装的版本,方法是:
- 菜单依次进入:windows–>Ppreferences–>MyEclipse–>Mave4MyEclipse–>Maven–>Installations
- 增加本地的maven到MyEclipse中
- 修改setting.xml文件
到此,MyEclipse的maven环境配置完成。
2.创建maven项目
开始创建maven项目,步骤
- MyEclipse中依次:New–>Other–>Maven–>Maven Project,然后下一步
- 使用默认工作空间的路径接着下一步
- 选择模板,一定要选择maven-archetype-webapp,这表明是在创建一个web工程,如果要创建普通java工程,则选择maven-archetype-quickstart接着下一步
- 填写项目的相关信息,点击完成
- 项目就创建完成了,目录结构如下
- 我们知道,maven对项目的结构是有一套默认的规则的,现在生成的这个结构中还不完整,我们需要手工再增加一些,如下图
- 配置项目属性,都是细节配置而且很重要:a)项目邮件菜单–>属性–>Java Build Path–>Source,点add folder,添加src/main/java, src/test/java, src/test/resources为source folder b)下边的default output folder修改为:helloworld/src/main/webapp/WEB-INF/classes c)修改这些source folder的输出目录,其中main/java和main/resources输出到default output folder, 而test/java和test/resources输出到target/test-classes中,(如何修改—点击各节点下的Output Folder, 再点右边的edit按钮就行了)最后设置结果如下: d)Order And Export,为了显示好看,调整一下显示顺序,如图所示: e)Libraris,修改jdk为本机的1.6.0_14,如下图:如果在settings.xml中的profiles标签中添加:<profile>
<id>jdk-1.6</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.6</jdk>
</activation>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.compilerVersion>1.6</maven.compiler.compilerVersion>
</properties>
</profile>那么MyEclipse将会默认生成jdk1.6的项目
- 到此为止,配置完毕,最后的项目结构:
3.项目运行
传统的方法,我们需要先去下载一个tomcat到本地,然后将项目发布到该tomcat中。使用maven后,tomcat都不用下载了,可以使用maven的内嵌tomcat,很方便,方法如下:
步骤:
- 打开MyEclipse的debug配置,依次打开菜单:Run-Debug Configerations tomcat:run 或 jetty:run
- 增加helloworld项目的配置
- 运行helloworld
- 访问:http://ip:8080/helloworld,能看到Hello World的字样
- 神奇吧,就这样就搞定了,可以开发调试了
4.项目打包、发布
这个更简单,在项目的任何一个文件中点击右键:Run As–>Maven Package,看看在target目录下,是不是已经生成了helloworld.war?
前边章节我们已经讲到,安装完maven后,还会创建一个mavenRepository目录,这个目录就是本地maven仓库,用来存放从中央仓库获取下来的构建和插件。这个地方,会有疑问了,什么是中央仓库?如何获取到本地的?原来,maven项目在开始时就创建了该仓库,目的是让maven开发者能够共享该仓库,从该仓库中获取构建,中央仓库的地址是:http://repo1.maven.org/maven2/;那么本地的maven是如何获取到中央仓库的构建的呢?换句话说,本地的maven怎么知道去这个地方获取构件?其实本地maven的源代码中有配置文件已经默认配置好了这个路径,具体在:%M2_HOME%\lib\maven-2.2.1-uber.jar中的org\apache\maven\project\pom-4.0.0.xml这个文件中,有兴趣的朋友可以打开该文件看一下,里边还定义了一些其他的maven配置信息,包括maven项目的默认包结构等等。
说到这个地方,肯定有人要说,全世界的maven开发者都去访问这个中央仓库?那它的压力得有多大啊!还有如果我的网速不够理想,下载一次构件都耗费好长时间啊。这都是一些典型的问题,就是因为这些问题,nexus应运而生了。
1.nexus介绍
nexus其实是一个仓库管理器,在使用maven的时候,你通常可以从中央仓库获取需要的构件,但这通常不是一个好的做法,你应该在本地架设一个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间,Nexus就可以满足这样的需要。说的通俗一点儿,就是在本地maven仓库和中央仓库之间再建一个中间仓库,本地仓库如果需要下载构件可以先去这个仓库管理器获取,如果仓库管理器有了那么直接就可以用,如果仓库管理器没有那么由它去中央仓库获取。通常,在一个公司内部,可以创建公司级的仓库管理器,相当于一个公司只有这个仓库管理器去和中央仓库打交道,而这个仓库管理器通常设置在公司内网,大大减轻了从中央仓库获取构件的带宽和不必要的磁盘浪费。
nexus还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。
2.nexus安装
本文章相关软件的环境信息:win7旗舰版32位、jdk1.6.0_14、maven2.2.1、nexus2.0.6
2.1下载
地址:http://www.sonatype.org/nexus/go
2.2安装
下载完,解压缩后可以看到两个文件夹,一个是nexus-2.0.6,另一个是sonatype-work,我们只需要将nexus-2.0.6拷贝到需要安装的路径即可,比如在我的机器上,我copy到了D:\maven目录下,sonatype-work可以不拷贝。
很简单,这就安装完了。
2.3启动
nexus已经将各个平台的启动脚本都写好了,并分开目录放置,具体可以查看nexus-2.06\bin\jsw目录,我的机器是windows32位的,就可以进入到windows-x86-32目录下,点击console-nexus.bat即可启动,启动完成后,访问url:http://localhost:8081/nexus即可看到nexus的页面如果是其他平台,找到对应的目录启动脚本即可。
到这里为止,我们的nexus就已经启动起来了,下一节,我们来讨论一下如何配置nexus。
上一章节,我们讲述了nexus的概况和安装,并且成功启动了nexus,这一节我们讨论下nexus是如何工作的,如果来配置和管理nexus的。
接着上一节,我们启动了nexus后,可以通过浏览器访问到nexus的管理界面:http://localhost:8081/nexus。管理员登陆密码默认为:admin/admin123,UI界面是Ext来搭建的,操作起来没有什么障碍,而且界面看起来很清爽。
好,我们输入用户名密码开始来配置nexus。
输入用户名密码登陆进去之后,看到如下界面:左侧分为4部分,其中views/repositories是仓库相关的管理项;security是安全权限相关的;administrotr是管理相关的;help是帮助相关的。
由于nexus提供的功能相当强大,咱们这篇文章只描述里边平时用的比较多的且较重要的部门说明,其余的可能会一笔带过或者忽略掉。
1.仓库配置
1.1仓库浏览
点击左侧的“views/repositories–>repositories”,右边列出来了nexus默认的仓库其中有四种类型的仓库,分别是hosted、proxy、virtual、group
- hosted,宿主型的,实实在在由nexus给管理的仓库,nexus自带了3个宿主仓库
- proxy,代理型的,每个仓库都是对一个远程仓库的代理,这其中就包括了对中央仓库的代理
- virtual,虚拟型的,这个不太了解,就不说了
- group,严格来说它不是一个仓库,顾名思义,是组的意思,它相当于是由多个仓库合成了一个组,由该组的url对外提供服务,nexus默认有两个组,一个是public group,其中包含了上边的3个宿主仓库和中央仓库;另一个是public snapshots group,里边包含了Apache Snapshots和CodeHaus Sanpshots。当然这些组包含的内容是可以修改的。
1.2打开远程索引下载
上一篇文章咱们也提到了,巨大的用户访问中央仓库会带来巨大的网络压力和服务器压力,因此在nexus中默认的各个代理仓库的索引都是关闭状态,即安装完nexus后里边是空的,什么东东都没有,包括索引。我们现在要做的就是需要把这个索引给下载到nexus服务器中,以便使用者可以从nexus中搜索到相关构建。
方法如下:
- 选中中央仓库这条记录,即名字为central的仓库
- 下边选中configuration选项卡,找到其中的Download Remote Indexes,把fasle改为true,并保存
- 在上边的中央仓库记录上点击右键,选择update index
- 下载完成后然后在下边选中Browse Index选项卡,打开central这颗树的节点,应该能看到内容。在下载索引之前是空的。
1.3搜索构件
在使用maven之前,如果我们 的项目中需要使用一个jar包,我们一般会怎么做呢?举个例子,我们要使用dom4j这个包,那么我们一般要去官方网站下载或者去baidu、google里边直接搜索,版本呢只能逮到哪个是哪个了。这种情况如果找一个两个jar还行,如果多了将会带来巨大的工作量,而且还非常容易导致缺包、冲突等问题。
现在有了maven,工作将会变的非常简单。还拿找dom4j这个jar来举例子,在nexus的页面中搜索“dom4j”这个词,看如下结果左侧的搜索框输入了dom4j,右侧上方出现了所有包含dom4j的项目,加入我们需要1.6.1版本的dom4j的jar,那么点击相应的条目在下方就会列出来。搜索到之后怎么用呢?右侧给出了依赖xml格式的数据,只需要将该xmlcopy到你的pom.xml中,那么你的项目将会自动从nexus下载(注:项目中配置nexus的方法还没说,下一篇文章细说)。
说到这里,可能会有疑问,那假如说我的项目需要A.jar,但是A.jar又依赖B.jar,那我是不是还要依次去找所有的依赖jar呢?答案是否定的,maven已经给你提供了最简单的方法,只要你依赖了A.jar,那么A.jar所需要的所有jar它将自动帮你查找下载。怎么样,省事了很多吧。
1.4创建仓库
我们来做一个创建proxy类型的仓库,点击仓库里边上方的“Add….—>Proxy Repository” Id是唯一的,输入一个名字,Remote Storage Location输入jboss的maven仓库地址,下边的代理相关的设置根据自己的情况来确定,输入完后点击保存即可。创建完成后按照1.2节提供的方法下载索引即可。
1.5组管理
组是若干仓库的一个集合,那么如何来管理组中包含的仓库呢?看下图:选中public group这条记录,选中下方的configuration选项卡,左侧列出了已经选择的仓库列表,右边是可选的,通过中间的箭头来控制仓库列表信息。
2.安全相关
主要是对nexus中资源的授权管理。
- security–>Change Password,修改当前用户的密码;
- security–>Privilege,权限点管理;
- security–>Roles,角色管理;
- security–>Users,用户管理
3.管理相关
3.1代理设置
如果nexus服务器上网需要设置代理,那么需要在Administrator–>Server中设置,如下图所示:
大概说了这么多,都是比较常用的,后续有什么变化,再继续添加。
上一篇文章,我们讨论了nexus的管理与配置。那么,当nexus配置完了之后,就相当于我们本地项目于maven中央仓库这个桥梁已经搭好了,剩下的就是看怎么通过怎样的配置来使用nexus。在本地开发的时候,主要牵涉到两个配置文件,一个是settings.xml(%M2_HOME%/conf/settings.xml和%USER_HOME%\.m2\settings.xml),一个是项目中的pom.xml。所有的主要配置都集中在这两个配置文件中,下边咱们就通过一个实际的项目的例子来说说这两个配置文件的用法。
再讲解之前,我先把我本地创建的一个项目的例子源代码发上来,下边讲的内容和它是对应的,我创建一个名字叫做onlinestore的一个项目。
onlinestore (42.5 KB, 66 点击)
1.项目描述
我们先从这个项目开始说起。onlinestore是一个主项目,onlinestore-core、onlinestore-interf、onlinestore-chinaweb、onlinestore-americaweb是onlinestore的4个子项目(其中前两个是java项目,后边两个是web项目)。在这里说子项目,可能大家还有些不太习惯或者不太好理解,这个子与父的关系,我们在后边会再说。注意:这里我起的在线商店这个项目,里边没有什么实质性的代码,只是想的框架和主要的配置文件。下边截图是这几个项目的工程结构图:在图中我们可以看到父项目和子项目在MyEclipse里边是平级的关系,在磁盘的目录结构中,子项目在父项目所在的文件夹中,如下图:其实在这两个截图中,都看不出里边的父子关系,真正的父子关系,在哪里定义呢?在pom.xml文件中,我们打开父项目的pom.xml文件,里边可以找到:
<modules>
<module>onlinestore-core</module>
<module>onlinestore-interf</module>
<module>onlinestore-chinaweb</module>
<module>onlinestore-americaweb</module>
</modules>
另外,在4个子项目的pom.xml的文件中,也能找到类似的:
<parent>
<artifactId>parent</artifactId>
<groupId>com.uuwit.onlinestore</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
也就是说,在父项目和子项目中,都有说明他们之间的关系。
说到这里,咱们说一下为什么要创建父项目和子项目,他们之间到底有着什么样的联系。通常一个大的项目会将项目分成多个模块,比如上边咱们举的例子,core是项目的一些核心类或者组件,interf放接口类,其余两个分别是两个相对独立的web模块。正常情况下,两个web模块比如会依赖core和interf这两个项目。而两个web项目之间通常并不会有依赖关系,但是他们之间却有很多共性的东西,比如说很多类似的配置、很多类似的jar包等等,这时候父项目和子项目的优势就能体现出来了。我们知道maven父项目和子项目的pom.xml是有继承关系的,也就是说各个模块相同的部分,我们可以配置到父项目的pom.xml文件中,这样子项目中的pom.xml只放自己个性的东西就可以了,这大大减少了工作量。另外,在编译和打包等其他阶段,都可以统一在父项目中来进行,maven会自动操作其中的子项目,提高了效率。
【注意:】事实上,所有的maven项目都会继承一个超级pom,这个pom就是%M2_HOME%\lib\maven-2.2.1-uber.jar中的org\apache\maven\project\pom-4.0.0.xml。
2.配置nexus
我们知道,我们假设仓库管理器的目的是为了减少与中央仓库的交互,既然这样,那我们在本地肯定要配置nexus的相关信息,以便能够把中央仓库的配置覆盖掉,从而真正来使用nexus。
两个步骤:
1.打开settings.xml文件:
<mirrors>
<!– mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
–>
<mirror>
<id>nexus-public-snapshots</id>
<mirrorOf>public-snapshots</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public-snapshots</url>
</mirror>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>
找到mirrors标签,在其中添加上边的配置,其中的localhots:8081根据自己的具体情况修改。
2.打开父项目的pom.xml文件,添加如下配置:
<distributionManagement>
<repository>
<id>repo</id>
<name>public</name>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
其中的localhots:8081根据自己的具体情况修改。
好了,就这么简单,就配置好了,如何验证一下项目真的不去找中央仓库的麻烦了呢?可以这么测试一下,你把你项目中使用到的一些构件在本地的maven仓库删除掉,然后再编译一下项目,在控制台打印的日志中,你能够清晰的看到都是从nexus中downlaod的,而在之前都是打印从中央仓库获取的。
3.java项目的几个操作
3.1编译
mvn compile,编译java项目,java文件将会被编译成class文件放到target/classes目录下
3.2打包
mvn package,打包java项目,项目将会打包成jar文件放到target目录下,jar文件的命名规则是:${project.artifactId}-${project.version}.jar
cmd 进入到有oracle包ojdbc6的目录
mvn
pom.xml中添加
<dependency>
<groupId>com.oracle</groupId>
<artifactId>oracle</artifactId>
<version>11.2</version>
</dependency>
3.3安装
安装的作用是将打包好的jar文件安装到本地的mavan仓库中,以供其他项目(如果其他项目依赖该项目的话)使用。
mvn install,在maven仓库中存放的目录结构是:${project.groupId}–>${project.artifactId}–>${project.version}
3.4部署
部署的作用是将打包好的jar文件上传到nexus中,以供其他同伴(如果其他同伴依赖该项目的话)使用。
mvn deploy,在这里要注意,在部署的时候,会提示401错误,此时你需要在setting.xml文件中添加鉴权信息,即在部署的时候需要使用nexus给分配的账户来上传。
在settings.xml中找到servers标签,在其中添加如下配置:
<server>
<id>repo</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
其中的用户名和密码是nexus分配的,其中的id一定要和父项目中pom.xml文件中刚才配置的repository和rnapshotRepository的id一致。
4.web项目的几个操作
先贴一下web项目的pom.xml的build标签:
<build>
<finalName>onlinestore-chinaweb</finalName>
<outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!–
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<parallel>methods</parallel>
<threadCount>10</threadCount>
<argLine>-Dfile.encoding=UTF-8</argLine>
<skip>true</skip>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<groupId>maven</groupId>
<artifactId>maven-clover-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
–>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<warName>onlinestore-chinaweb</warName>
<attachClasses>true</attachClasses>
<classesClassifier>classes</classesClassifier>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<webappDirectory>${project.build.directory}/onlinestore-chinaweb
</webappDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<charset>${project.build.sourceEncoding}</charset>
<url>http://localhost:8080/manager</url>
<!– <server>tomcat.server</server> –>
<path>/onlinestore-chinaweb</path>
<port>8080</port>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<warFile>${project.build.directory}/onlinestore-chinaweb.war</warFile>
<uriEncoding>${project.build.sourceEncoding}</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
4.1全局配置
- outputDirectory要重新指定,指定到src/main/webapp/WEB-INF/classes目录下,否则默认会是在test/classes目录
4.2war插件
配置比较简单,不再累述。
4.3tomcat插件
tomcat插件可以让你不使用外部的tomca,而使用起内嵌的tomcat,这样更省劲,更简单。如果你不想使用内嵌的tomcat,也可以单独指定,需要在<configuration>标签中指定tomcat的server的id,这个id也需要在settings.xml中的servers标签中定义。
其中的tomcat端口可以自己指定。
所有评论(0)