什么是Maven
Maven是现在的Java程序员应该都会遇到或使用的一个工具。那Maven具体是什么?到底能干什么?
Maven是一个项目管理工具,用来管理项目的生命周期,如项目中各个项目之间的依赖管理,项目中使用到的jar包依赖管理,还有许多项目构建的插件等。使用Maven最大的好处就是不再需要我们手工维护项目中的各种jar包,及jar包需要依赖的其他jar包,也不再需要我们解决各种jar包之间的冲突,这一切maven帮我们都做好了。
目前Java开发中流行的集成开发工具Idea已经集成了Maven工具,打开Idea的设置选择Maven项,就可以看到自带的Maven的一些信息。我觉得Idea自带的Maven就挺好的,就没有去再安装一个。但是之前不知道Idea自带Maven工具,为此有次出现一个问题,就是因为两个Maven仓库的原因。在公司的电脑上我自己装了一个Maven,自己的电脑上没有装,直接使用Idea自带的Maven。
Maven仓库
使用 Maven 给我们带来的最直接的帮助,就是 jar 包得到了统一管理,那么这些 jar 包存放在哪里呢?它们就在您的 本地仓库 中,位于 C:\Users\用户名.m2 目录下(当然也可以修改这个默认地址)。
实际上可将本地仓库理解“缓存”,因为项目首先会从本地仓库中获取 jar 包,当无法获取指定 jar 包的时候,本地仓库会从 远程仓库(或 中央仓库) 中下载 jar 包,并放入本地仓库中以备将来使用。这个远程仓库是 Maven 官方提供的,可通过 http://search.maven.org/ 来访问。这样一来,本地仓库会随着项目的积累越来越大。通过下面这张图可以清晰地表达项目、本地仓库、远程仓库之间的关系。
Maven命令
Maven执行命令有两种方式:
- Interactive Mode(交互模式)
- Batch Mode(批处理模式)
交互模式创建项目
执行下面的命令
1 | mvn archetype:generate |
接下来会出现下面的选项:
- 项目 Archetype Version(原型版本号)是什么?—— 可选择 1.0 版本
- 项目 groupId(组织名) 是什么?—— 可输入 net.ydstudio
- 项目 artifactId(构件名)是什么?—— 可输入 maven-demo
- 项目 version(版本号)是什么?—— 可输入 1.0
- 项目 package(包名)是什么?—— 可输入 net.ydstudio.demo
使用批处理模式创建项目
1 | mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=net.ydstudio -DartifactId=maven-demo -Dversion=1.0 |
创建项目这事我觉得还是用Idea来做,方便快捷。用命令创建的话,命令有时记得不全,不是很方便。
创建成功之后的项目中一般会有下面的几个目录,如果没有的话就自行创建。
- src/main/java,主要代码存放的地方
- src/test/java,测试代码存放的地方
- src/main/resources,配置、资源文件存放的地方
- src/main/webapp,Web应用相关代码存放的地方
还有一个重要的文件: pom.xml;pom.xml称为Project Object Model(项目对象模型),它用于描述整个Maven项目,所以也称为Maven描述文件。pom.xml 才是理解 Maven 的关键点,很有必要看看它到底长什么样。
pom文件
打开生成的pom文件,内容如下:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
我们来解释一下:
modelVersion:这个是pom的版本号,现在都是4.0.0的,必须得有,但不需要修改。
groupId、artifactId、version:分别表示 Maven 项目的组织名、构件名、版本号,它们三个合起来就是 Maven 坐标,根据这个坐标可以在 Maven 仓库中对应唯一的 Maven 构件。
packaging:表示该项目的打包方式,war 表示打包为 war 文件,默认为 jar,表示打包为 jar 文件。
name、url:表示该项目的名称与 URL 地址,意义不大,可以省略。
dependencies:定义该项目的依赖关系,其中每一个 dependency 对应一个 Maven 项目,可见 Maven 坐标再次出现,还多了一个 scope,表示作用域(下面会描述)。
build:表示与构建相关的配置,这里的 finalName 表示最终构建后的名称 maven-demo.war,这里的 finalName 还可以使用另一种方式来定义(下面会描述)。
我们可以在 pom.xml中定义一些列的项目依赖(构件包),每个构件包都会有一个 Scope(作用域),它表示该构件包在什么时候起作用,包括以下五种:
- compile:默认作用域,在编译、测试、运行时有效
- test:对于测试时有效
- runtime:对于测试、运行时有效
- provided:对于编译、测试时有效,但在运行时无效
- system:与 provided 类似,但依赖于系统资
Maven常见命令
前面我们已经使用了几个 Maven 命令,例如:mvn archetype:generate,mvn tomcat7:run-war 等。其实,可使用两种不同的方式来执行 Maven 命令:
- mvn <插件>:<目标> [参数]
- mvn <阶段>
现在我们接触到的都是第一种方式,而第二种方式才是我们日常中使用最频繁的,例如: - mvn clean:清空输出目录(即 target 目录)
- mvn compile:编译源代码
- mvn package:生成构件包(一般为 jar 包或 war 包)
- mvn install:将构件包安装到本地仓库
- mvn deploy:将构件包部署到远程仓库
执行 Maven 命令需要注意的是:必须在Maven项目的根目录处执行,也就是当前目录下一定存在一个名为 pom.xml 的文件。