Maven2和maven1的区别

1.更快更简单

相对于Maven1缓慢的运行速度,Maven2在速度上有了质的飞跃,甚至可以和Ant相比(当然下载不算)。此外,“简化工作,使用业界公认的最佳实践”是Maven2的另一个主题,其他新功能反映了Maven2在任何地方简化工作的努力。

2.更少的配置文件

Maven1与Maven2主要配置文件对比;

Maven1: project.xml、maven.xml、project.properties和build.properties

Maven 2: pom.xml和settings.xml

POM是Maven的核心对象模型。在Maven2中,POM已经从project.xml转移到pom.xml,版本也从3升级到了4。对于项目,一般只需要pom.xml。

Maven2中不需要或不建议使用maven.xml,原因如下:

增强插件的易用性。

maven.xml中分散的内容很难在不同项目间共享,也不利于维护。在Maven2中,建议使用自定义插件来封装这些内容。

如果您仍然希望能够使用maven.xml这样的特性,比如

在Maven2中,配置使用settings.xml,它替换了原始的project.properties和build.properties。

用户级别,用于操作系统登录用户。一般在$home/.m2/,对于windows用户来说是目录:C:\ Documents and Settings \ user name \ . m2 \ Settings . XML。

全局级:一般在%M2_HOME%/conf/settings.xml,其中M2_HOME是Maven2的根目录环境变量名。

Settings.xml可以配置,比如本地存储库、代理等。settings.xml的结构可以从Maven官网获得。

3.插件语言替换

在Maven2中,插件的语言由jelly改为Java和BeanShell。Java速度更快,开发者也更熟悉。对于其他流行的脚本,比如groovy,Maven的官网,意见是等到更成熟的时候。

4.提供预定义的目录模板

好的目录结构可以让开发者更容易理解项目,为以后的维护打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了默认的标准目录模板。

使用目录模板可以使pom.xml更加简洁。因为Maven2已经根据默认目录预定义了相关动作,无需人工干预。以资源目录为例:

Src/main/resources,负责管理项目主体的资源。用Maven2编译后,这个目录下的所有文件和子目录都会被复制到target/classes目录下,为以后的打包提供了方便。

Src/test/resources,它负责管理项目测试的资源。在使用Maven2执行测试编译之后,这个目录中的所有文件和子目录都将被复制到target/test-classes目录中,为后续测试做好准备。

在Maven1中,这些动作需要在maven.xml中使用

要创建标准目录模板,可以使用以下命令:

mvn原型:create-DgroupId = com . codeline . commons-darti factid = codeline commons

groupId和artifactId的含义与Maven1中的含义相同,参数artifactId的值将作为项目根目录的名称。除了建立相应的目录,Maven2还将创建默认的pom.xml。

Maven2还认为不同类型的项目需要有不同的目录结构。如果创建web项目,可以使用命令:

mvn原型:create-DgroupId = com . my company . app

-darti factd = my-web app

-DarchetypeArtifactId = maven-archetype-web app

5.生命周期介绍

Maven2中有明确的生命周期概念,并且都提供了相应的命令,使得项目构建更加清晰。主要生命周期阶段:

验证项目是否正确,以及所有必需的资源是否可用。

编译,编译项目的源代码。

测试-编译,编译项目测试代码。

测试,用编译好的测试代码测试编译好的源代码。

包,一种发布的格式,比如jar,把编译好的源代码打包。

集成——在可以运行集成测试的环境中测试、处理和发布包。

验证,运行任何检查以验证包是有效的并且符合质量标准。

Install,它将包安装在本地存储库中,并且可以被其他项目用作依赖项。

在集成或发布环境中执行的Deploy将包的最终版本复制到远程存储库中,以便其他开发人员或项目可以使用它。

Generate-sources,它生成应用程序所需的任何附加源代码,比如xdoclet。

如果要编译一个项目,直接输入:mvncomplete即可,其他阶段以此类推。阶段之间存在依赖关系,比如测试依赖于测试-编译。当执行mvn测试时,将首先运行mvn测试编译,然后运行mvn测试。

6.添加依赖范围

在POM 4中,

默认值Compile适用于所有阶段,并将随项目一起发布。

与compile类似,Provided希望JDK、容器或用户提供这种依赖。比如servlet.jar

运行时,只在运行时使用,如JDBC驱动,适用于运行时和测试阶段。

Test只在测试期间使用,用于编译和运行测试代码。不会随项目一起发布。

与provided类似,System需要显式地提供一个包含依赖项的jar,Maven不会在存储库中查找它。

& lt范围& gt使用的示例:

& lt依赖性& gt

& ltgroupId & gt冬眠& lt/groupId & gt;

& ltartifactId & gt冬眠& lt/artifact id & gt;

& lt版本& gt3 . 0 . 3 & lt;/version & gt;

& lt范围& gt测试& lt/scope & gt;

& lt/dependency & gt;

7.转移依赖关系并简化依赖关系管理。

在Maven1中,需要列出依赖项所需的包。这对于使用Hibernate之类东西的用户来说太多了,也不方便。在Maven2中实现了传输依赖,这样Maven2就会自动下载Hibernate所依赖的包,开发者只需要关心Hibernate就可以了。

注意:只有Maven支持的依赖项,通常以插件的形式,才能获得这个特性。此外,对于一些旧插件,由于时间原因,可能不支持传递依赖。比如,至少在Maven 2.0.1中,对于Hibernate 2.1.2,还是需要明确列出Hibernate 2.1.2所依赖的包。