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所依赖的包。
相关推荐
maven-dependency-tree-1.0.jar maven-deploy-plugin-2.7.jar maven-deploy-plugin-2.8.1.jar maven-eclipse-plugin-2.9.jar maven-embedder-3.2.1-sources.jar maven-filtering-1.1.jar maven-install-plugin-2.3.1...
spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持 spring-cloud-netflix-zuul-websocketspring 应用程序中支持Zuul反向代理web套接字支持的...用法spring-cloud-netflix-zuul-websocket可以从 Maven
jcaptcha-2.0-alpha-1相关jar,共4个文件 jcaptcha-2.0-alpha-1-SNAPSHOT.jar jcaptcha-api-1.0.jar jcaptcha-integration-simple-servlet-2.0-alpha-1-SNAPSHOT.jar filters-2.0.235.jar
### Maven + Pluto 2.0 搭建 Portlet 环境 #### 环境准备 在开始搭建 Portlet 2.0 模拟环境之前,我们需要确保以下环境已经准备好: 1. **Sun JDK 1.5 以上版本**(推荐使用 1.7 或更高版本)。 2. **Apache ...
官方版本,亲测可用
官方版本,亲测可用
【Selenium2.0+ Maven+TestNG】自动化测试框架搭建详解 自动化测试是软件开发过程中不可或缺的一部分,它能够提高测试效率,减少手动测试的工作量。Selenium2.0(也被称为Selenium WebDriver)是一个广泛使用的...
10. **版本范围**:在依赖中使用`[version]`范围可以指定版本号的约束,例如`[1.0,2.0)`表示1.0(含)到2.0(不含)之间的所有版本。 通过理解和掌握这些Maven的使用技巧,你将能更高效地管理和构建Java项目。记得...
### Eclipse 下 Selenium 2.0+ Maven + TestNG 环境搭建详解 #### 前言 在软件测试领域,尤其是Web应用的功能自动化测试中,Selenium 是一个非常流行的框架。结合Maven(用于构建管理和依赖管理)与 TestNG(用于...
3. **使用版本范围**:如`[1.0,2.0)`表示1.0及以上但小于2.0的版本,有利于自动化升级。 4. **使用Maven Profiles**:针对不同环境(如开发、测试、生产)定义不同的配置。 通过深入学习和使用"Maven 3.6.0",...
6. **版本范围(Version Ranges)**:在某些情况下,开发者可能希望声明一个依赖版本范围,例如`[1.0,2.0)`表示至少1.0版本但不超过2.0版本的任何版本。这样可以允许Maven自动选择该范围内的最新兼容版本。 7. **...
对于依赖的版本,可以使用范围声明(如`[1.0,2.0)`),允许Maven自动选择兼容的最新版本。 3. **使用Maven Profile** 通过Profile可以在不同环境(如开发、测试、生产)下配置不同的属性和依赖。 4. **自定义...
对于ANTLR来说,它可能是BSD风格的许可证或者Apache 2.0许可证,这些都允许在遵守一定条件的情况下自由使用、修改和分发软件。 使用ANTLR Maven插件的步骤大致如下: 1. 在项目的`pom.xml`文件中添加ANTLR插件的...
version="[1.0,2.0)" ``` 4. **添加依赖**: 在`<dependencies>`标签下,列出所有bundle所依赖的外部库。每个依赖项都需要指定groupId, artifactId和version。 5. **运行Maven构建**: 在Eclipse中,可以通过右键...
首先,集成Maven与Tomcat的核心在于Maven的插件管理。我们需要在项目的`pom.xml`文件中引入`maven-eclipse-plugin`和`maven-war-plugin`插件。`maven-eclipse-plugin`用于将Maven项目转化为Eclipse可识别的格式,而`...
maven-artifact-2.0.jar maven-artifact-3.0.jar maven-artifact-manager-2.0.4.jar maven-artifact-manager-2.0.5.jar maven-artifact-manager-2.0.8.jar maven-artifact-manager-2.0.9.jar maven-artifact-manager...
- **使用版本范围**:在`pom.xml`中使用版本范围(如`[1.0,2.0)`),允许Maven自动选择最合适的版本。 - **构建验证**:设置Maven插件对上传到仓库的构件进行验证,确保其符合特定的质量标准。 综上所述,Maven仓库...
3. **版本管理**: Maven支持版本范围,如`[1.0,2.0)`表示1.0到2.0(不包含2.0)之间的版本。 **八、插件管理** 1. 插件使用: 通过`<build><plugins>`配置插件及其参数。 2. 插件绑定: 可以将插件绑定到生命周期的...