Myeclipse下通过maven管理项目
?MavenAnt标准构建文件project.xml 和 maven.xmlbuild.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
安装步骤:
很简单,就这几步就安装完了,验证一下是否安装成功,在命令行窗口中输入: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使用的是哪个版本,咱们都统一改成刚才下载到本地安装的版本,方法是:
到此,MyEclipse的maven环境配置完成。
2.创建maven项目开始创建maven项目,步骤
那么MyEclipse将会默认生成jdk1.6的项目
到此为止,配置完毕,最后的项目结构:传统的方法,我们需要先去下载一个tomcat到本地,然后将项目发布到该tomcat中。使用maven后,tomcat都不用下载了,可以使用maven的内嵌tomcat,很方便,方法如下:
步骤:
这个更简单,在项目的任何一个文件中点击右键:Run As–>Maven Package,看看在target目录下,是不是已经生成了helloworld.war?
?
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。
左侧分为4部分,其中views/repositories是仓库相关的管理项;security是安全权限相关的;administrotr是管理相关的;help是帮助相关的。由于nexus提供的功能相当强大,咱们这篇文章只描述里边平时用的比较多的且较重要的部门说明,其余的可能会一笔带过或者忽略掉。
1.仓库配置1.1仓库浏览点击左侧的“views/repositories–>repositories”,右边列出来了nexus默认的仓库其中有四种类型的仓库,分别是hosted、proxy、virtual、group
上一篇文章咱们也提到了,巨大的用户访问中央仓库会带来巨大的网络压力和服务器压力,因此在nexus中默认的各个代理仓库的索引都是关闭状态,即 安装完nexus后里边是空的,什么东东都没有,包括索引。我们现在要做的就是需要把这个索引给下载到nexus服务器中,以便使用者可以从nexus中 搜索到相关构建。
方法如下:
在使用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中资源的授权管理。
如果nexus服务器上网需要设置代理,那么需要在Administrator–>Server中设置,如下图所示:
?
大概说了这么多,都是比较常用的,后续有什么变化,再继续添加。
??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?install:install-file?-DgroupId=com.oracle?-DartifactId=oracle?-Dversion=11.2 -Dpackaging=jar?-Dfile=ojdbc6.jar
pom.xml中添加
<dependency>
?? ??? ?<groupId>com.oracle</groupId>
?? ??? ?<artifactId>oracle</artifactId>
?? ??? ?<version>11.2</version>
?? ?</dependency>
安装的作用是将打包好的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.3tomcat插件tomcat插件可以让你不使用外部的tomca,而使用起内嵌的tomcat,这样更省劲,更简单。如果你不想使用内嵌的tomcat,也可以单 独指定,需要在<configuration>标签中指定tomcat的server的id,这个id也需要在settings.xml中的 servers标签中定义。
其中的tomcat端口可以自己指定。