对于Maven一直都持工具主义的态度,在项目中边用边查,了解的知识是杂七杂八,毫无章法,没有一个系统的掌握。
今天抽时间来梳理一下,希望能够查缺补漏,起到一些好的效果。
这一篇是Maven基础知识,下节会介绍Maven的属性。
Maven介绍
Maven是Apache旗下一个纯Java开发的开源项目,基于项目对象模型(即我们熟悉的POM)概念。能管理一个项目的构建、报告和文档等步骤。
Maven能做什么
Maven可以用于构建和管理各种项目,不仅限于java,其他语言如C#、Ruby、Scala编写的项目也能够胜任。
Maven的功能
构建、依赖、文档生成、报告、发布、分发、邮件列表、SCMs(前两个我们每天都会用到应该很熟悉了)。
Maven的约定配置
Maven使用约定优于配置的原则,提倡使用一个标准的目录结构,如下
目录 | 目的 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
不用说,非常熟悉吧,一个标准Maven工程结构。
Maven的特点
- 项目设置遵循统一规则
- 任意工程中共享
- 依赖管理自动更新
- 依赖库庞大且不断增长
- 可扩展,可以编写Java或脚本语言的插件
- 基于模型构建
- 向后兼容
- 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号
- 并行构建:编译的速度能普遍提高20%~50%
- 提供Maven wiki页面链接展示的错误报告
Maven与JDK对应关系
Maven版本 | JDK版本 |
---|---|
3.3 | 1.7及以上 |
3.2 | 1.6及以上 |
3.0/3.1 | 1.5及以上 |
Maven仓库
本地仓库
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
在Maven配置文件settings.xml中指定本地仓库的位置。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:/MyLocalRepository</localRepository>
</settings>
远程仓库
如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库
在pom.xml中指定远程仓库的位置。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>com.companyname.common-lib</groupId>
<artifactId>common-lib</artifactId>
<version>1.0.0</version>
</dependency>
<dependencies>
<repositories>
<repository>
<id>companyname.lib1</id>
<url>http://download.companyname.org/maven2/lib1</url>
</repository>
<repository>
<id>companyname.lib2</id>
<url>http://download.companyname.org/maven2/lib2</url>
</repository>
</repositories>
</project>
中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库的关键概念:
- 这个仓库由 Maven 社区管理。
- 不需要配置。
- 需要通过网络才能访问。
Maven依赖搜索顺序
- 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
- 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
- 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
- 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。