Maven的简介

  Maven这个词可以翻译为“专家”、“内行”。作为 Apache 组织中的一个颇为成功的开源项目,Maven 主要工作为基于 java 平台的项目构建、依赖管理以及项目信息管理,在大小型应用中都具有非常重要的作用。

  Maven的作用主要体现在两个词上面:项目管理。项目管理从技术上来理解,就是 Maven 为项目提供了一种让团队能够更科学地管理、构建项目的手段。我们可以用配置文件的方式对项目的描述、名称、项目版本号、项目依赖等信息进行描述,使我们的项目结构更加清晰。

  并且,有一些项目需要依赖一些第三方项目的模块或组件来完成,那么 Maven 则提供了一种 Maven仓库 的概念。将这些依赖全部放到 Maven仓库中,其他项目如果想要使用这些依赖,直接到仓库中取即可,避免了到开源网站下载 jar 包资源的步骤。

项目构建

  在写代码的时候,构建(build)是我们经常使用的一个操作。在项目周期中,每天打开项目的第一件事就是从源代码库签出最新的代码,然后进行测试,测试失败则进行调试,修复错误代码。

  细心留意可以发现,我们在编写项目的时候,大部分时间都花在了编译、单元测试、生成文档、打包和部署等繁琐的工作上,这些工作就是构建。手工去执行这些步骤将会浪费大量的时间,成本代价太大,于是有人提出了用软件的方法让这些繁琐的工作自动化,使软件的构建能够一步完成,实现构建的自动化。

项目构建工具
1. Ant

  最早的构建工具,基于IDE,在2000年左右诞生,是当时最流行的 java 构建工具,不过它的 XML 脚本编写格式使得 XML 文件特别大,但是其对工程构建过程中的过程控制得特别好。

2. Maven

  项目对象模型,通过其描述信息来管理项目的构建,报告和文档的软件项目管理工具。它填补了 Ant 的缺点,仍然采用 XML 作为配置文件格式,第一次支持了从网络上下载的功能,只需给定依赖的 URL,Maven便会自动将依赖 jar 包下载到本地。Maven 专注的是依赖管理,使用 java 编写。

3. Gradle

  结合了以上两个的优点,继承了 Ant 的灵活性和 Maven 的生命周期管理,它最后被 google 采用,作为 Android 的御用管理工具。它与前两个相比最大的区别在于不用 XML 作为配置文件格式,采用了 DSL 格式,使得脚本更加简洁。

  目前市面上 Ant 版本比较老,所以一般是一些比较传统的软件公司使用;Maven 使用 java 编写,是当下大多数互联网公司会使用的一个构建工具;Gradle 是用 groovy 编写的,是目前比较新型的构建工具,一些初创互联网公司会使用,以后有很大的使用空间。

Maven四大特性
1. 依赖管理

  Maven 为 java 世界引入了一个新的依赖管理系统:jar 包管理。当需要使用某个 jar 包时,不需要再从网络上下载并导入了,只需要配置其依赖即可;而当 jar 包需要升级时,也不需要重新下载最新的包并重新导入,只要修改 pom.xml 配置文件即可。在 java 世界中,可以用 groupIdartifactIdversion 组成的 Coordination(坐标)唯一标识一个依赖。

  同时,任何基于 Maven 构建的项目自身也必须定义这三项属性,生成的包可以是 jar 包,也可以是 war 包。一个典型的依赖引用如下所示:

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
</dependency>

坐标属性的理解

  Maven 坐标为各种组件引入了秩序,任何一个组件都必须定义自己的坐标。

  • groupId:定义当前Maven项目隶属的实际项目-公司名称(jar 包所在仓库路径)。由于 Maven 中模块的概念,因此一个实际项目往往会被划分为很多模块。比如 Spring 是一个实际项目,其对应的 Maven 模块会有很多,如spring-core、spring-webmvc等。
  • artifactId:该元素定义实际项目中的一个 Maven 模块-项目名,推荐的做法是使用实际项目名称作为 artifactId 的前缀。比如,spring-bean、spring-webmvc等。
  • version:该元素定义 Maven 项目当前所处的版本。
2. 多模块构建

  项目复查时,使用将 daoservicecontroller 层分离的方式,将一个项目分解为多个模块已经是一个很通用的方式。

  在 Maven 中需要定义一个 parent POM 作为一组 module 的聚合 POM。在该 POM 中可以使用 <modules> 标签来定义一组子模块。parent POM 不会有什么实际构建产出,而 parent POM 中的 build 配置以及依赖配置都会自动继承给子模块。

3. 一致的项目结构

  在 Ant 时代,大家创建 java 项目目录时比较随意,然后通过 Ant 配置指定哪些属于 source,哪些属于 testSource等。并且,不同的 IDE (IDEA和Eclipse)创建项目时,目录结构是不一样的,这就会导致两种 IDE 的项目不能兼容导入。而 Maven 在设计之初的理念就是 “Conversion over configuration”(约定大于配置),其制定了一套统一的项目目录结构作为标准的 java maven 项目结构,解决了不同 IDE 带来的文件目录不一致问题,只要是 Maven 项目,在各个 IDE 中建立的项目结构都是一样的。

4. 一致的构建模型和插件机制

  在编写 JavaWeb 项目时需要使用类似 tomcat 的服务器,我们可以通过插件的形式将服务器引入进来。例如,如果需要使用 jetty 的服务器,可以通过下面的配置将 jetty 服务器引入进来。

<plugin>
	<groupId>org.mortbay.jetty</groupId>
	<artifactId>maven-jetty-plugin</artifactId>
	<version>6.1.25</version>
	<configuration>
		<scanIntervalSeconds>10</scanIntervalSeconds>
		<contextPath>/test</contextPath>
	</configuration>
</plugin>