项目经理(Project manager)是项目的支柱与核心,维基百科的定义:项目经理是项目管理方面的专家,负责项目的策划、执行和结束,即整个生命周期过程。项目经理手中的“干将莫邪”便是软件开发过程方法(software development process/software development life cycle (SDLC)),可能采取的有RUP(Rational Unified Process),敏捷等。
其实软件开发区分阶段已经广为大家接受,普遍的概念即需要区分为分析、设计、实施、测试、发布,过程中会产生若干产物,如需求说明书、概要设计、详细设计等。若提及过程方法,如RUP的话,主要分为四大阶段,先启(Inception)、精华(Elaboration)、构建(Construction)、交付(Transition)迭代的开发方式,而Scrum的核心概念则是Sprint。
Maven在项目管理中有那些帮助呢?Maven能够从一个信息中心为项目提供构建,报告,文档编制等工作。在Maven官方介绍《What is maven》中介绍了maven的项目目标(Objectives)(http://maven.apache.org/what-is-maven.html),如下:
l 简化构建过程
l 提供统一的构建系统
l 提供项目质量信息
l 提供对于开发最佳实践的指导
l 允许对于新特性的透明整合
对于Maven影响最为深刻的就是它的构建系统,几乎贯穿了整个实施阶段。作为对比我们参考一下RUP的Construction阶段,以及Scrum的单个Sprint过程。
RUP的Construction阶段的目标:
这个阶段的目标是澄清需求并基于架构基线完成开发。
l 通过优化资源来缩减开支,并避免无意义的争执与返工。
l 实用性与质量兼具。
l 尽快发布可用版本。
l 完成对所有功能的分析、设计、开发、测试。
l 采用增量迭代的模式完成开发并准备交付。
l 检查项目发布的所有资源是否已经准备完全。
l 形成项目组之间的并行开发。
在《硝烟中的Scrum与XP》一书中,介绍了作者实施Scrum的过程。在一个Sprint中,不是只有Sprint backlog、burn down chat等,实施过程中的敏捷思想也是其中的核心,我们来看看敏捷信奉的一部分最佳实践:
l 简单设计(Simple Design)
l 结对编程(Pair Programming)
l 测试驱动(Test-Driven Development)
l 小规模发布(Small Releases)
l 持续集成(Continuous Integration)
l 集体拥有代码(Collective Code Ownership)
l 编码标准(Coding Standard)
Maven对于上述目标中的质量(实用性与质量,以测试驱动)、可用(可用版本,小规模)、资源管理等均能发挥较大的作用。主要是其定义了一套完整优秀的构建生命周期机制,其基本阶段如下:
l validate – 验证项目正确性及依赖有效性
l compile – 编译项目源码
l test – 使用合适的单元测试框架对编译后的源码进行测试,测试代码不会被打包或发布
l package –将编译后的代码以规定格式打包,如Jar
l integration-test – 将打包后的代码放置于环境中进行集成测试
l verify – 检查打包的有效性并验证质量标准
l install – 将包装载入本地仓库,以提供与其他项目的依赖
l deploy – 将包发布至远程仓库中
其上每一个阶段实际都分为前中后三个阶段,用户可以定义在每一个阶段前后进行自定义的操作,打造自己的构建流程(如在某个阶段执行前制定特殊的配置文件,完成后再改回默认)。对于阶段的实际使用方式,如:validate可以项目所有依赖有效,test可以针对dao层进行单元测试,intergration-test可以对完整业务流程或服务层等进行集成测试。
在项目中实际使用的经验,对于标签的使用心得:
1.<dependency> - 依赖标签,最重要的标签,也是Maven的基础功能。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
2. <repository> - 资源仓库,可以包含多个,常用的有Maven,Jboss等,如下是公司内建的Nexus资源库。
<repository>
<id>Suntang's Maven Repository</id>
<name>Suntang Nexus Repository</name>
<url>http://10.10.10.33:8081/nexus/content/groups/public</url>
</repository>
3. <profile> - 解释为情景模式可能较为合适。可以有多个,在何种场景下会使用哪些属性、插件等。如下例子便是当缺失某个文件时激活。
(感觉写的不错的一篇,http://blog.csdn.net/turkeyzhou/article/details/4894657)
<profile>
<activation>
<file>
<missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing>
</file>
</activation>
</profile>
4.<build> - 构建过程。是进行整个项目管理的核心标签。重点需要掌握的知识就是生命周期。
(http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference)
下面的例子就是制定了打包时的资源路径,并且定义了最终打包的名称。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<resource>
<directory>src/main/assembly</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
<finalName>po</finalName>
</build>
4.< plugin > - 支持插件。如单元测试自动化,之前提到的Ant的插件等。若有某些功能觉得不顺手,可以尝试官网找一下有没有合适的插件(http://maven.apache.org/plugins/index.html)。
下面的例子就是在集成测试中,只运行后缀为TestSuitex.java的测试类
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<junitArtifactName>junit:junit</junitArtifactName>
<forkMode>once</forkMode>
</configuration>
<executions>
<execution>
<id>default-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<skip>false</skip>
<includes>
<include>**/*TestSuitex.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>