用Maven做项目管理
在Java世界中我们很多的开发人员选择用Ant来构建项目,一个build.xml能够完成编译、测试、打包、部署等很多任务,但我们也碰到了很多的问题,如jar文件管理混乱,各个项目结构和build.xml相差很大等等。而Maven的出现,给项目提供了更多的支持。
1 简介
Maven作为Apache的一个开源项目,旨在给项目管理提供更多的支持,主页地址为
http://maven.apache.org
。它最早的意图只是为了给apache组织的几个项目提供统一的开发、测试、打包和部署,能让开发者在多个项目中方便的切换。很多伟大的事业,出发点都很简单,ebay就是很好的例证。而maven的成功又一次验证了这一点,越来越多的项目开始使用maven。
基本原理
Maven的基本原理很简单,采用远程仓库和本地仓库以及一个类似build.xml的pom.xml,将pom.xml中定义的jar文件从远程仓库下载到本地仓库,各个应用使用同一个本地仓库的jar,同一个版本的jar只需下载一次,而且避免每个应用都去拷贝jar。如图1。同时它采用了现在流行的插件体系架构,只保留最小的核心,其余功能都通过插件的形式提供,所以maven下载很小(1.1M),在执行maven任务时,才会自动下载需要的插件。
这个基本原理与Pear――PHP扩展与应用库(the PHP Extension and Application Repository)的原理非常相似,都有一个官方的仓库,都是微内核,通过网络将需要的文件下载到本地,通过官方仓库将相应的类库进行统一管理。Pear已经成为PHP开发事实上的标准,而Maven在Java世界的地位也逐渐加强,成为标准指日可待。
另外由于插件的易开发性,现在有了非常多的可供选择的插件,如与eclipse结合的插件,与test相关的插件,后面我们结合maven在项目中的使用进行详细介绍。
图1
2 项目管理
Maven官方把maven定义为一个项目管理工具,我们不妨看看maven能给我们的项目提供哪些好的支持。
2.1 项目标准化
Maven一个重要特性是定义了项目的标准模板,官方说法是最佳实践。可以通过命令:mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app创建一个单一的maven项目。创建好的项目,具有了特定的项目结构。这个项目结构是参考业界的最佳实践而成,为后面使用统一的maven命令打下了基础,如测试mvn test、打包mvn package等,无需写一行脚本,就可以方便的实现众多功能。Maven还提供其它一些类型模板,可以通过添加-DarchetypeArtifactId={type}创建,如-DarchetypeArtifactId=maven-archetype-site,生成site类型的项目。
同时一些好的开源软件使用了maven,也能作为很好的项目模板,如Equinox(Appfuse的简化版),它的pom定义了对hiberante,spring…的依赖,可以通过ant new -Dapp.name=NAME快速生成项目原型,然后对pom文件进行裁减,以符合自身项目的需要。
有了这个标准,项目间能方便的进行交流,你也很容易了解其它使用maven项目的结构。对于企业来说,引入maven就自然引入了规范,这可比费时费力的写文档,定规范有效的多了。
2.2 文档和报告
使用mvn site可以快速生成项目站点,apache很多开源项目站点都采用maven生成,会出现built by maven字样的图标。
而maven提供的针对如junit,checkstyle,pmd等的插件,能够方便的进行测试和检查并能直接生成报告。使用都很简单,如mvn surefire-report:report 就能自动进行junit测试,并生成junit报告,mvn pmd:pmd生成pmd报告。具体使用可以在
http://maven.apache.org/plugins/index.html
找到。
2.3 类库管理
Maven一个很重要的特色就是类库管理。通过在pom.xml中定义jar包版本和依赖,能够方便的管理jar文件。以下是一个简单的jar定义片断:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.1</version>
<type>jar</type>
<scope>runtime</scope>
</dependency>
这个片断告诉我们,依赖的jar包groupId为org.hibernate,artifactId为hibernate,版本为3.1,scope为runtime。在实际项目中,会将M2_REPO(maven本地仓库地址)/ org/hibernate / hibernate /3.1/ hibernate -3.1.jar放入classpath。
同时maven会通过pom.xml管理jar包间的依赖。比如上面的hibernate-3.1.jar同级目录肯定会有一个hibernate -3.1.pom,在这个pom文件中指定了这个jar对其它一些jar的依赖。而这个pom文件是远程仓库提供,无需进行修改,执行maven相关命令就会自动根据相关依赖去下载jar包。这样只需定义对hibernate的依赖而无需关心相关jar,在构建项目上方便了很多。
因为pom文件对jar的管理,也产生了一个很吸引人的特性:项目文件很小。以往一个web项目中,jar文件都要放入WEB-INF/lib下,并放入cvs(svn)中,很容易就达到几十M。而通过maven,只需一个pom.xml,在执行mvn eclipse:eclipse时再去远程仓库下载,项目文件一般只需几百K。
2.4 发布管理
使用maven可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用mvn package打包,它会自动先运行mvn test,跑所有的testcase,只有全部通过才能正确打包。生成的war包(如果项目的packaging为war)在target目录下。这个war包与使用ant脚本生成一样,但无需一行脚本,这也是maven对比ant的优势之一。使用mvn install将编译和打包好的文件发布到distributionManager指定的远程repository。使用mvn deploy可以自动管理项目版本。
3 使用maven
Maven使用简单,插件丰富且经过大量项目考验,在项目中引入的风险很小。笔者在项目中使用maven,新进员工在半小时内就能成功使用maven构建项目,并很快掌握几个常用的命令。Maven也不需要什么特殊的设施。如果项目全部使用开源软件,并且不需要maven管理项目版本,只需要一个SCM环境(CVS或SVN),共享开发源码就可以。把pom.xml中的repository设为官方地址就行,配置如下:
<repository>
<id>central</id>
<url>http://www.ibiblio.org/maven2</url>
</repository>
这个官方remote repository上有非常多的开源软件,应该能满足大部分项目的需要。如果有项目需要而它上面暂时还没有的软件,或者希望使用公司内部的软件,那么就需要自己配置一个repository了。
3.1 自建私服
传奇私服大家应该都听过,一个网吧自己搞个私服,一伙人免费在上面砍杀。官方因此少赚了很多钱,因此总想打击。而maven官方却对自建私服很是支持,我们总算可以正正当当搞把私服了(Springside的老大江南白衣就是创建私服的好手)。我们就来介绍下自建私服的最快方法。
首先需要一个http server,找台服务器装上apache就行。放一个空的maven目录到htdocs下,假设服务器ip为192.168.0.1,确认能用
http://192.168.0.1/maven
访问到。然后在自己机器上装好maven2,初始化好项目,在pom.xml放入需要的jar定义,运行如mvn eclipse:eclipse就自动从官方下载jar到本地,如果不做配置,默认本地repository为${user.home}/.m2/。对于windows xp来说一般在C:/Documents and Settings/%username%/.m2下,其中%username%为操作系统登录用户名。这时你可以看到${user.home}/.m2/下多了个repository目录,里面有很多的项目相关jar,目录按groupId/ artifactId/version排好。把repository目录整个拷贝到apache服务器的maven目录下,如果需要官方缺少的jar或公司内部jar,仿照这个目录结构,做好jar放到maven目录下。自建私服成功!
要使用私服,只需修改pom.xml,在repository配置后加上:
<repository>
<id>companyName</id>
<url>http:// ${ip}/maven</url>
</repository>
这样需要下载jar时,会先到本地repository查看,没有下载过再到官方搜索,没有找到再到后面的repository查找。
3.2 安装配置
Maven的安装很简单:
1. 从apache网站上下载maven安装包,实际上就是个压缩文件。将其解压到你想要存放maven的目录中。在这里假设你将maven解压到C:/Program Files/Apache Software Foundation/maven-2.0.4中。
2. 将C:/Program Files/Apache Software Foundation/maven-2.0.4/bin设到你的系统环境变量%PATH%中。
3. 同时确保你已经将你的JDK安装目录设为java_home系统变量。
4. 打开个命令行窗口,运行mvn –version验证是否安装成功。
5. 如果使用eclipse,在运行mvn eclipse:eclipse生成eclipse项目文件后,需加入M2_REPO到Classpath Variables中,指向本地repository,例如:C:/Documents and Settings/Owner/.m2/repository。
3.3 基本使用流程
在项目进程中,不必做什么配置,在pom.xml同级目录,cmd使用简单的maven命令,就可以完成初始化->开发->测试->发布的全过程。Maven的基本使用流程如下图:
其中在初次使用命令mvn eclipse:eclipse时会下载很多的插件和jar,可能需要较长的时间,建议泡杯咖啡,和同事吹吹牛。如果失败,可能是网络问题,可以重新运行mvn eclipse:eclipse,已下载好的插件和jar不会再下。运行mvn test和mvn package等命令,产出物都会放在target目录下。如果在使用过程中有什么问题,也可以和我联系,mail:[email protected],我们一起来尝试解决。
总结:
Maven作为新的项目管理工具,简单易用,能对项目的各个阶段提供大力支持,同时由于它易扩展的插件体系架构,出现了越来越多的插件,也使得其功能更加强大。短短一篇文章,实在很难把其特点一一尽述,maven还有很多好用的功能和插件等待我们去使用和开发。而学习新技术的最好方式就是实践,大家如果有兴趣,尽快下载一个最新版,开始你的maven之旅吧!
参考文档:
1.
http://maven.apache.org
官方网站文档
2.
http://www-128.ibm.com/developerworks/cn/opensource/os-maven2/
Maven2的新特性
Maven 出现到现在也有很长时间了,初识它的感觉至今仍清晰的印在脑海中。现在想来,当时从 Ant 移情 Maven 的想法其实很朴素,就是因为 Maven 可以以网站的形式展现与项目相关的信息,如开发人员列表、各种 Report。这种方式为项目的构建带来了极大的方便,尤其是 Report 的。试想对于产生的 Junit-Report、JavaDoc、CheckStyle、PMD 等报告,如果没有一个统一的入口,每次切换目录是多么令人厌烦的事情!
Maven 无疑是相当成功的,这一点从越来越多的开源项目开始使用 Maven 就可以看出。Maven 取得成功的原因很简单:在简化构建脚本的同时,功能并没有缩水,反而有所增强;提供汇集项目信息的工具,并以相当友好的方式呈现;丰富的插件简化了工作。如此有力的工具出现,自然是争相使用。
新特性
如今 Maven2 已经推出,Maven 的官方网站称,Maven2 相对于 Maven1 是一个相当大的转变,甚至不惜牺牲兼容性来达到这一目的。(为了 Maven1 的用户着想,Maven1 仍在继续他的使命。)如此大的变动到底换来了什么样的结果?
1. 更快、更简单
比起 Maven1 那不急不慢的运行速度,Maven2在速度上有了质的飞跃,甚至与Ant相比也毫不逊色(当然,下载不算)。除此之外,"简化工作,使用业界公认的最佳实践"也是是 Maven2 的另一大主题,其他的新特性无处不在体现 Maven2 为简化工作而做出的努力。
2. 更少的配置文件
Maven1 和 Maven2 主要配置文件的对比:
Maven1:project.xml、maven.xml、project.properties和build.properties。
Maven2:pom.xml和settings.xml。
POM是Maven的核心对象模型,在Maven2中POM已由project.xml转移到pom.xml中使用,版本也由3升级为4。对于项目,一般只需要pom.xml就行了。
在Maven2中不需要也不提倡使用maven.xml,原因如下:
plugin的易用性的增强。
散布于maven.xml中的内容难以在不同项目间共享,也不利于维护。在Maven2中建议使用自定义的plugin来封装这些内容。
如果仍期望能够使用类似maven.xml的功能,如<preGoal>,请参考Inserting non-standard build steps using preGoals and postGoals。
在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在两种级别:
用户级,针对操作系统登录用户而言。一般在$home/.m2/,对于windows用户,就是目录:C:/Documents and Settings/用户名/.m2/settings.xml。
全局级:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目录环境变量名。
在settings.xml中可以配置,如本地Repository、proxy等等,关于settings.xml的结构可以从Maven的官方网站上获取。
3. Plugin语言更换
在Maven2中,编写plugin的语言由jelly变更为Java和BeanShell。Java在速度上更有优势,而且开发人员的熟悉程度更高。对于其他的流行脚本,如groovy,Maven的官方网站的意见是,等待其更成熟时再考虑
。
4. 提供预定义的目录模板
好的目录结构可以使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下:
使用目录模板,可以使pom.xml更简洁。因为Maven2已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以resources目录为例:
src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。
src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。
这些动作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>来完成的。如今,完全不需要在pom.xml中指定就能够自动完成。在src和test都使用resources,方便构建和测试,这种方式本就已是前人的经验。通过使用Maven2,使这个经验在开发团队中得到普及。
创建标准目录模板,可以通过如下命令:
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
groupId和artifactId的含义与Maven1中的含义一样,参数artifactId的值会作为项目根目录的名字。除了建立相应的目录之外,Maven2还会创建缺省的pom.xml。
Maven2也考虑到:不同类型的项目需要拥有不同的目录结构。如创建web项目,可以使用命令:
mvn archetype:create -DgroupId=com.mycompany.app
-DartifactId=my-webapp
-DarchetypeArtifactId=maven-archetype-webapp
5. 生命周期的引入
在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:
validate,验证工程是否正确,所有需要的资源是否可用。
compile,编译项目的源代码。
test-compile,编译项目测试代码。
test,使用已编译的测试代码,测试已编译的源代码。
package,已发布的格式,如jar,将已编译的源代码打包。
integration-test,在集成测试可以运行的环境中处理和发布包。
verify,运行任何检查,验证包是否有效且达到质量标准。
install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
generate-sources,产生应用需要的任何额外的源代码,如xdoclet。
如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。
6. 新增Dependency Scope
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
compile,缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
<scope>的使用举例:
<dependency>
<groupId>hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
7. 传递依赖,简化依赖管理
在Maven1中,需要把依赖所需要的包也一并列出。这对于使用类似如Hibernate的用户来说所操的心太多了,而且也不方便。在Maven2中实现了传递依赖,如此对于Hibernate所依赖的包,Maven2会自动下载,开发人员只需关心Hibernate即可。
注意:只有得到Maven支持的依赖,通常是plugin形式出现,才能获得这个特性。而且对于一些老的plugin,可能由于时间的关系不支持传递依赖。如至少在Maven 2.0.1中,对于Hibernate 2.1.2,仍然需要显式列出Hibernate 2.1.2所依赖的包。
使用简介
安装Maven2的步骤非常简单:首先从Maven官方网站下载相应的软件包,目前是Maven 2.0.1;然后解压,并设置环境变量M2_HOME= Maven2的解压安装目录;最后将%M2_HOME%/bin添加到path中,方便Maven在任何目录下运行。
Maven2的运行命令是mvn,使用mvn -h可以获得相关的帮助信息。常用情形:
创建Maven项目:mvn archetype:create
编译源代码:mvn compile
编译测试代码:mvn test-compile
运行测试:mvn test
产生site:mvn site
打包:mvn package
在本地Repository中安装jar:mvn install
清除产生的项目:mvn clean
或许是由于刚刚推出的缘故,Maven2目前还是有一些不尽如人意的地方。尤其是Report部分的plugin,有的是因为目前还没有,如junit-report。有的则是一些莫名其妙的问题,如checktyle和pmd,在本地locale下都无法正常工作。以pmd举例,在产生PMD报告时会抛出如下异常:
java.util.MissingResourceException: Can't find bundle for base name pmd-report,
locale zh_CN
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle
.java:839)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:808)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:702)
……
幸运的是,Maven2一出现就备受关注,要不了多长时间,诸如此类的问题应该就会很快解决。
结论
Maven2在Maven1的优势基础之上,又向前迈进了一大步。它提供的这些新特性大大地缩短了开发管理中的工作量,使得开发人员将精力集中在实际的业务问题上。而且这些新特性对于简化使用,普及最佳实践,也起到了积极的作用。
参考资料
Inserting non-standard build steps using preGoals and postGoals
http://docs.codehaus.org/display/MAVEN/Maven2+Goal+Decoration
Maven官方网站
http://maven.apache.org/
Maven支持的依赖列表
http://www.ibiblio.org/maven2
在 Eclipse 中利用 Maven
项目管理: Maven 让事情变得简单
本文来自CSDN博客,转载请标明出处:
http://blog.csdn.net/it_man/archive/2006/10/23/1346604.aspx
()
Maven常用命令
创建普通应用项目:
mvn archetype:create -DgroupId=cn.com.company -DartifactId=TestDBUnit
创建WEB项目:
mvn archetype:create -DgroupId=com.mycompany.webapp -DartifactId=myweb -DarchetypeArtifactId=maven-archetype-webapp
补充:简单解释一下:
archetype 是一个内建插件,他的create任务将建立项目骨架
archetypeArtifactId 项目骨架的类型
可用项目骨架有:
* maven-archetype-archetype
* maven-archetype-j2ee-simple
* maven-archetype-mojo
* maven-archetype-portlet
* maven-archetype-profiles (currently under development)
* maven-archetype-quickstart
* maven-archetype-simple (currently under development)
* maven-archetype-site
* maven-archetype-site-simple, and
* maven-archetype-webapp
groupId 项目的java包结构,可修改
artifactId 项目的名称,生成的项目目录也是这个名字,可修改
发布到本地:
mvn install:install-file -Dfile=D:/opensource/dbunit-2.2/dbunit-2.2.jar -DgroupId=dbunit-DartifactId=junitperf -Dversion=2.2 -Dpackaging=jar
发布到远程:
mvn deploy:deploy-file -DgroupId=staticComparison -DartifactId=static-comparison -Dversion=2.0 -Dpackaging=jar -Dfile=c:/staticComparison_2.0.jar -Durl=file:Y:/repo
生成Eclipse项目结构:
mvn eclipse:eclipse
清理(删除target目录下编译内容)
mvn clean
仅有页面文件发生变化时
mvn war:exploded
1.只对src.test.java下的MyTest类进行测试
mvn test -Dtest=MyTest
2.如果测试类里没有测试方法不报错
mvn test -Dtest=MyTest -DfailIfNoTests=false
3.打包之前不执行单元测试
mvn package -Dmaven.test.skip=true
()
maven命令
it
2008-09-06 18:04 阅读 129 评论 0
字号:
大
大
中
中
小
小
小弟最近研究Tapestry5,开始自己创建项目不成功,看到用maven来下载demo项目,小弟不才装起maven,把玩了一下,终于搞到Tapestry5的demo。并附上我所知道的maven命令
查看maven信息
mvn --version
创建项目
mvn archetype:create -DgroupId=包名 -DartifactId=项目名
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
打包项目
mvn package
清除项目的打包
mvn clean dependency:copy-dependencies package
创建项目站点
mvn site
编译相应的jave 文件
mvn compile
运行测试类
mvn test
项目变成eclipse
mvn eclipse:eclipse
项目变成idea
mvn idea:idea
附上
下载tapestry 5demo 的maven 命令
mvn archetype:create -DarchetypeGroupId=org.apache.tapestry -DarchetypeArtifactId=quickstart -DgroupId=org.example -DartifactId=myapp -DpackageName=org.example.myapp -Dversion=1.0.0-SNAPSHOT
()
maven的配置有3个阶段:
1.Project - most static configuration occurs in pom.xml
2.Installation - this is configuration added once for a Maven installation
3.User - 这个配置需要制定一个特殊用户。
注意:the installation and user configuration cannot be used to add shared project information - for example, setting <organization> or <distributionManagement> company-wide.
你可以在多个project中的pom.xml制定一个父pom.xml来共享配置。
maven的配置文件是settings.xml,默认有可能在conf目录下,也有可能在${user.home}/.m2/settings.xml,后面将有文章详细介绍该配置文件
下面介绍几个配置项:
1.本地库
<settings>
...
<localRepository>/path/to/local/repo/</localRepository>
...
</settings>
默认在${user.home}/.m2/repository/.
注意是绝对路径。
2.配置代理
后面将有文章详细介绍
3.安全和部署设置
<settings>
...
<servers>
<server>
<id>repo1</id>
<username>repouser</username>
<!-- other optional elements:
<password>my_login_password</password>
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>my_key_passphrase</passphrase>
-->
</server>
...
</servers>
...
</settings>
4.使用镜像
使用镜像的几个原因:
4.1你有一个在网络上同步的镜像,速度很快,并且离你很近。
4.2你可以用特定的库来替换你的内部库以获取更大的控制权。
4.3你想在本地运行maven-proxy 为镜像提供一个本地cache,并且需要使用URL来替换。
<settings>
...
<mirrors>
<mirror>
<id>planetmirror</id>
<name>Australian Mirror of http://repo1.maven.org/maven2/</name>
<url>http://public.planetmirror.com/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
...
</mirrors>
...
</settings>
5.Profiles文件
可以提供多个Profiles来切换你的环境
(二)
:在使用之前,应首先安装JDK。
#可以去
//10.0.0.3/java
共用目录中下载,下载完后解压到指定的目录中,如C:/Program Files/apache-maven-2.2.0
#配置环境变量:1)MAVEN_HOME: 你安装的Maven的目录,如C:/Program Files/apache-maven-2.2.0
#在Path 中加入%MAVEN_HOME%/bin
配置完之后,在命令窗口中使用mvn –version 会出现如下信息
此时,maven已经安装配置好了。
=使用maven来构建项目,从源代码编译成二进制项目文件=
用maven对项目打包,比如用svn下载项目从
svn://10.0.0.58:8000/java/materias/poc/maven/core/,下载到指定的目录,比如放在E:/workspace/java/materias/poc/maven/core目录下
1)项目的结构如下
即包括src源代码目录,unit test源码目录,以及配置文件目录resources
打开命令窗口,用cd命令转到项目所在的目录下,如
运行mvn compile,假如下现如下的结果,则该命令运行成功。
该命令是用来编译所有的的(java)源文件,编译后生成所有的class文件放在根目录下的target/classes目录下,即如
除此之外,maven还有很多其他常用的命令方式,比如:
*mvn test-compile //编译测试代码 ,比如编译test下的源文件,编译后生成的所有的class文件放在根目录下的target/test-classes目录下
*mvn test //运行应用程序中的单元测试,比如对以上的项目,测试生成的结果放在根目录下的target/surefire-reports目录下,
*mvn clean //清除目标目录中的生成结果 delete target,即会清除生成的target目录
*mvn package //依据项目生成 jar或者war/sar文件,比如对以上的项目,生成的包文件会放在根目录下的target/目录下的core-1.0.jar文件,这里要注意的是运行了mvn package命令以后,对于这之前的操作(包括mvn compile,mvn test-compile,mvn test)命令,都会自动运行
*mvn install // 在本地 Repository 中安装 jar或者war //,即将生成的jar或者war放在本地的Repository中,这里要说明的是,maven中默认的Repository是在C:/Documents and Settings/(当前系统用户的名称)/.m2/repository目录下,我们也可以人为的将它存放在指定的目录下,步骤是打开maven的安装目录,打开conf/下的settings.xml文件,修改其中的<localRepository>,比如将其修改为 中间就是所要指定的目录,如对以上的项目,执行了mvn install项目后,不仅在根目录下生成target/目录,同时还会将生成的jar文件存放到Repository中,即E:/app/m2/repository中
=mvn的运行简单机制=
通过pom.xml来进行构建。 比如Pom.Xml以上项目中的pom.xml文件
<modelVersion> --描述这个POM文件遵从哪个版本的项目描述符;
<groupId> -- 针对一个项目的普贤遍唯一识别符。通常用一个完全正确的包的名字来与其他项目的类似名字来进行区分;比如以上的项目,生成的(java)源文件会放在根目录下的/target/classes/com/sunvalley/demo中,/com/sunvalley/demo便是这里<groupId>所唯一标识的;
<artifactId> -- 项目的通用名称
<packaging> -- 打包扩展名(JAR、WAR、EAR),举个例子jar,war,pom Plugings能够创建他们自己的包,包括包的类型;比如以上的项目生成的core-1.0.jar文件
<name> -- 当前项目的全称;
<version> --当前项目产生的artifact的当前版本;
<description> -- 当前项目的一个细节描述;
除此之外还有一些其它的元素,如<dependencies>
<dependencies>这个元素描述了所有与当前项目相关的依赖。
<dependencies>
<dependency> 可以配置多个相关的依赖
<groupId>activation</groupId> 所依赖组件的标识符
<version>1.0.1</version> 所依赖组件的版本
<properties> 所依赖组件的属性
<war.bundle.jar>true</war.bundle.jar>
</properties>
</dependency>
</dependencies>
比如以上项目中的
这是在以上项目中进行unit test所要用到的一个工具junit。groupId是该组件的标识符,artifactId表示该组件的通用名称,version表示该组件的版本,scope:用于限制相应的依赖范围,还有其他的几种范围如
compaile :默认范围,用于编译
runtime:在执行时,需要使用
test:用于test任务时使用
此外在<dependencies>中可以配置多个<dependency>,即多个组件的配置
=Maven-proxy的使用=
#maven-proxy的作用
maven-proxy是你访问maven仓库(repository)的代理,它可以连接多个maven仓库,但对你来说,你只需要知道maven-proxy就够了。
更重要的是,maven-proxy可以看作是maven仓库在你本地的缓存,这在团队开发的时候会节省下载jar包的时间。比如,你的团队有10个人,默认的情况下maven repository的服务器为
http://repo2.maven.org/maven2
,这个
http://repo2.maven.org/maven2
可能访问很慢。开发中,10个人都需要分别连接
http://repo2.maven.org/maven2
下载。现在你本地假设了一个maven-proxy B。所有的人都直接连接B。这样,只有第一个人在下载时,B会从
http://repo2.maven.org/maven2
下载jar包,同时缓存,其他9个人只需要从B下载就够了。那么如何让B来访问
http://repo2.maven.org/maven2
呢
#配置代理
##打开安装maven的目录下的conf目录下的settings.xml文件
##配置其中的<profiles>…</profiles>和<activeProfiles>…</activeProfiles>元素,如将它们配置为如下:其中的<url>就是服务器所在的url,注<profile>里的<id>与<activeProfiles>中的<activeProfile>对应。
##保存后,将配置好的settings.xml文件拷贝到本地的repository仓库的同级目录下,比如说放在E:/app/m2
##此时,重新启动该服务器,之后对以上的项目(从SVN下载下来的项目)进行打包,即如该项目放在E:/workspace/java/materias/poc/maven/core目录下,重新打开一个命令窗口,用cd命令转到该目录下,执行mvn compile即编译该项目的命令,此时会出现像如下的结果:
这说明已经成功的在服务器上download了文件oscache-2.4.jar,到这里就已经代理成功了,如要访问其它的服务器,只需在配置settings.xml文件的时候,服务器的全称改为此服务器的全称即可,如:
<url>的中间便是所要访问服务器的全称。
注:有关于服务器的设置请参看有关的附录。
文章出处:DIY部落(
http://www.diybl.com/course/7_databases/database_other/20090827/172526.html
)
(三)
说完了settings.xml配置,下来说一下maven2的主要配置pom.xml
什么是pom?
pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
快速察看:
<project>
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
基本内容:
POM包括了所有的项目信息。
maven 相关:
pom定义了最小的maven2元素,允许groupId,artifactId,version。所有需要的元素
groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为:/org/codehaus/mojo
artifactId: 项目的通用名称
version:项目的版本
packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par
classifier: 分类
POM关系:
主要为依赖,继承,合成
依赖关系:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
groupId, artifactId, version:描述了依赖的项目唯一标志
可以通过以下方式进行安装:
使用以下的命令安装:
mvn install:install-file ?Dfile=non-maven-proj.jar ?DgroupId=some.group ?DartifactId=non-maven-proj ?Dversion=1
创建自己的库,并配置,使用deploy:deploy-file
设置此依赖范围为system,定义一个系统路径。不提倡。
type:相应的依赖产品包形式,如jar,war
scope:用于限制相应的依赖范围,包括以下的几种变量:
compile :默认范围,用于编译
provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
runtime:在执行时,需要使用
test:用于test任务时使用
system:需要外在提供相应得元素。通过systemPath来取得
systemPath: 仅用于范围为system。提供相应的路径
optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用
独占性
外在告诉maven你只包括指定的项目,不包括相关的依赖。此因素主要用于解决版本冲突问题
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
表示项目maven-embedder需要项目maven-core,但我们不想引用maven-core
继承关系
另一个强大的变化,maven带来的是项目继承。主要的设置:
定义父项目
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
</project>
packaging 类型,需要pom用于parent和合成多个项目。我们需要增加相应的值给父pom,用于子项目继承。主要的元素如下:
依赖型
开发者和合作者
插件列表
报表列表
插件执行使用相应的匹配ids
插件配置
子项目配置
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
</project>
relativePath可以不需要,但是用于指明parent的目录,用于快速查询。
dependencyManagement:
用于父项目配置共同的依赖关系,主要配置依赖包相同因素,如版本,scope。
合成(或者多个模块)
一个项目有多个模块,也叫做多重模块,或者合成项目。
如下的定义:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<modules>
<module>my-project1<module>
<module>my-project2<module>
</modules>
</project>
build 设置
主要用于编译设置,包括两个主要的元素,build和report
build
主要分为两部分,基本元素和扩展元素集合
注意:包括项目build和profile build
<project>
<!-- "Project Build" contains more elements than just the BaseBuild set -->
<build>...</build>
<profiles>
<profile>
<!-- "Profile Build" contains a subset of "Project Build"s elements -->
<build>...</build>
</profile>
</profiles>
</project>
基本元素
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
defaultGoal: 定义默认的目标或者阶段。如install
directory: 编译输出的目录
finalName: 生成最后的文件的样式
filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值
资源(resources)
你项目中需要指定的资源。如spring配置文件,log4j.properties
<project>
<build>
...
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes>
<include>configuration.xml</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<testResources>
...
</testResources>
...
</build>
</project>
resources: resource的列表,用于包括所有的资源
targetPath: 指定目标路径,用于放置资源,用于build
filtering: 是否替换资源中的属性placehold
directory: 资源所在的位置
includes: 样式,包括那些资源
excludes: 排除的资源
testResources: 测试资源列表
插件
在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等
<project>
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>...</dependencies>
<executions>...</executions>
</plugin>
</plugins>
</build>
</project>
extensions: true or false,是否装载插件扩展。默认false
inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
configuration: 指定插件配置
dependencies: 插件需要依赖的包
executions: 用于配置execution目标,一个插件可以有多个目标。
如下:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>echodir</id>
<goals>
<goal>run</goal>
</goals>
<phase>verify</phase>
<inherited>false</inherited>
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
说明:
id:规定execution 的唯一标志
goals: 表示目标
phase: 表示阶段,目标将会在什么阶段执行
inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件
configuration: 表示此执行的配置属性
插件管理
pluginManagement:插件管理以同样的方式包括插件元素,用于在特定的项目中配置。所有继承于此项目的子项目都能使用。主要定义插件的共同元素
扩展元素集合
主要包括以下的元素:
Directories
用于设置各种目录结构,如下:
<build>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
...
</build>
Extensions
表示需要扩展的插件,必须包括进相应的build路径。
<project>
<build>
...
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-3</version>
</extension>
</extensions>
...
</build>
</project>
Reporting
用于在site阶段输出报表。特定的maven 插件能输出相应的定制和配置报表。
<reporting>
<plugins>
<plugin>
<outputDirectory>${basedir}/target/site</outputDirectory>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet></reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
Report Sets
用于配置不同的目标,应用于不同的报表
<reporting>
<plugins>
<plugin>
...
<reportSets>
<reportSet>
<id>sunlink</id>
<reports>
<report>javadoc</report>
</reports>
<inherited>true</inherited>
<configuration>
<links>
<link>
http://java.sun.com/j2se/1.5.0/docs/api/</link>
;
</links>
</configuration>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
更多的项目信息
name:项目除了artifactId外,可以定义多个名称
description: 项目描述
url: 项目url
inceptionYear:创始年份
Licenses
<licenses>
<license>
<name>Apache 2</name>
<url>
http://www.apache.org/licenses/LICENSE-2.0.txt</url>
;
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
Organization
配置组织信息
<organization>
<name>Codehaus Mojo</name>
<url>
http://mojo.codehaus.org</url>
;
</organization>
Developers
配置开发者信息
<developers>
<developer>
<id>eric</id>
<name>Eric</name>
<email>[email protected]</email>
<url>
http://eric.propellors.net</url>
;
<organization>Codehaus</organization>
<organizationUrl>
http://mojo.codehaus.org</organizationUrl>
;
<roles>
<role>architect</role>
<role>developer</role>
</roles>
<timezone>-6</timezone>
<properties>
<picUrl>
http://tinyurl.com/prv4t</picUrl>
;
</properties>
</developer>
</developers>
Contributors
<contributors>
<contributor>
<name>Noelle</name>
<email>[email protected]</email>
<url>
http://noellemarie.com</url>
;
<organization>Noelle Marie</organization>
<organizationUrl>
http://noellemarie.com</organizationUrl>
;
<roles>
<role>tester</role>
</roles>
<timezone>-5</timezone>
<properties>
<gtalk>[email protected]</gtalk>
</properties>
</contributor>
</contributors>
环境设置
Issue Management
定义相关的bug跟踪系统,如bugzilla,testtrack,clearQuest等
<issueManagement>
<system>Bugzilla</system>
<url>
http://127.0.0.1/bugzilla</url>
;
</issueManagement>
Continuous Integration Management
连续整合管理,基于triggers或者timings
<ciManagement>
<system>continuum</system>
<url>
http://127.0.0.1:8080/continuum</url>
;
<notifiers>
<notifier>
<type>mail</type>
<sendOnError>true</sendOnError>
<sendOnFailure>true</sendOnFailure>
<sendOnSuccess>false</sendOnSuccess>
<sendOnWarning>false</sendOnWarning>
<configuration><address>[email protected]</address></configuration>
</notifier>
</notifiers>
</ciManagement>
Mailing Lists
<mailingLists>
<mailingList>
<name>User List</name>
<subscribe>[email protected]</subscribe>
<unsubscribe>[email protected]</unsubscribe>
<post>[email protected]</post>
<archive>
http://127.0.0.1/user/</archive>
;
<otherArchives>
<otherArchive>
http://base.google.com/base/1/127.0.0.1</otherArchive>
;
</otherArchives>
</mailingList>
</mailingLists>
SCM
软件配置管理,如cvs 和svn
<scm>
<connection>scm:svn:
http://127.0.0.1/svn/my-project</connection>
;
<developerConnection>scm:svn:
https://127.0.0.1/svn/my-project</developerConnection>
;
<tag>HEAD</tag>
<url>
http://127.0.0.1/websvn/my-project</url>
;
</scm>
Repositories
配置同setting.xml中的开发库
Plugin Repositories
配置同 repositories
Distribution Management
用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置
1 配置到文件系统
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>file://${basedir}/target/deploy</url>
</repository>
</distributionManagement>
2 使用ssh2配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scp://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
3 使用sftp配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>sftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
4 使用外在的ssh配置
编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scpexe://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh-external</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
5 使用ftp配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>ftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
repository 对应于你的开发库,用户信息通过settings.xml中的server取得
Profiles
类似于settings.xml中的profiles,增加了几个元素,如下的样式:
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
(四)