以前老是写代码,也没有深深的研究jar的管理。直到接触一些大数据的MapReduce编程,才了解到Maven项目管理。
想必要,我就提出了两个疑问。为什么要使用Maven,Maven又是什么呢?
Why?
我以前写的代码项目只是一些阿猫阿狗的项目,也就是个简易的图书管理系统或成绩管理系统,但是当项目非常庞大时,就不适合用package来划分模块,这个时候就需要每一个模块对应一个工程就有利于协作。
Maven可以解决你使用jar包的烦恼情况
- 频繁的调用某个jar包,不停的复制jar包到项目的lib中,当你使用Maven时,就可以将jar包保存在仓库中,使用时,只要引用就可以了
- 借助Maven,可以统一的在官网上下载
- 可以很好的区分jar包的版本,在应用jar包时,借助Maven也可以很好的导入
What?
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动的完成项目的基础工具项目,Maven使用标准的目录结构和默认生命周期。
使用Maven也可以构建,把动态的Web工程经过编译结果部署到服务器上的整个过程。编译就是让java文件转变成class文件,部署就是在sevlet容器中运行的是编译后的文件。
How?
创建一个Maven项目
1. 根目录:工程名
2. |---src:源码
3. |---|---main:存放主程序
4. |---|---|---java:java源码文件
5. |---|---|---resource:存放框架的配置文件
6. |---|---test:存放测试程序
7. |---pom.xml:maven的核心配置文件
POM文件内容
pom.xml:Project Object Model项目对象模型。它是maven的核心配置文件,所有的构建的配置都在这里设置
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.imooc.bigdata</groupId>
<artifactId>hadoop-train-v2</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>hadoop-train-v2</name>
<url>http://maven.apache.org</url>
<properties>
<!--定义Hadoop版本-->
<hadoop.version>2.6.0-cdh5.15.1</hadoop.version>
</properties>
<!---引入cdh的仓库-->
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>
<dependencies>
<!--添加Hadoop依赖包-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--添加junit依赖包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
常用Maven命令
1. mvn clean:清理
2. mvn compile:编译主程序
3. mvn test-comilt:编译测试程序
4. mvn test:执行测试
5. mvn package:打包
6. mvn install:安装
需要注意的是执行maven命令必须要进入到pom.xml目录中进行执行
仓库默认位置:c:Users[登录当前系统的用户名].m2 repository
坐标
<dependenciens>
<dependency>
<!--1、公司或组织域名倒序+项目名-->
<groupId>org.springframework</groupId>
<!--2、模块名-->
<artifactId>spring-core</artifactId>
<!--3、版本-->
<version>4.3.4.RELEASE</version>
<scope>comile</scope>
</dependency>
<dependenciens>
maven工程的坐标与仓库路径的关系
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.imooc.bigdata</groupId>
<artifactId>hadoop-train-v2</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>hadoop-train-v2</name>
本项目坐标
<dependencies>
<!--添加Hadoop依赖包-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
依赖的项目的坐标
去本地仓库查看一下这个项目
这下来对Maven的仓库、依赖、生命周期做出一些介绍
仓库分类:
- 本地仓库:当前电脑上的仓库
- 远程仓库:1)私服:搭建在局域网中,一般公司都有私服
2)中央仓库:架设在Internet上
依赖:
- maven解析依赖信息时(根据maven坐标)会到本地仓库中曲查找被依赖的jar包
-如果依赖的是自己或者团队开发的maven工程,需要先使用install命令把被依赖的maven工程的jar包导入本地仓库
eg.本人创建一个工程,缺少依赖的jar包(其他项目有这个jar包),就需要到其他有这个jar包的项目中,执行mvn install命令
依赖范围:
- compile,默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段
- provided,只在开发、测试阶段适用,目的是不让Servlet容器和你本地jar包冲突
- runtime,只在运行时适用,如jdbc
- test,只在测试使用
- system,类似provided,需要显式提供包含依赖的jar
生命周期:
Maven有三套互相独立的生命周期,相互独立
Clean Lifecycle在进行真正的构建之前进行一些清理工作。
- pre-clean执行一些需要在clean之前完成的工作
- clean移除所有上一次构建生成的文件
- post-clean执行一些需要在clean之后立刻完成的工作
Default Lifecycle构建的核心部分,编译,测试,打包,部署
1、validate
2、generate-sources
3、process-sources
4、generate-resources
5、process-resources 复制并处理资源文件,至目标目录,准备打包
6、compile 编译项目的源代码
7、process-classes
8、generate-test-sources
9、process-test-sources
10、generate-test-resources
11、process-test-resources 复制并处理资源文件,至目标测试目录
12、test-compile 编译测试源代码
13、process-test-classes
14、test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
15、prepare-package
16、package 接受编译好的代码,打包成可发布的格式,如 JAR
17、pre-integration-test
18、integration-test
19、post-integration-test
20、verify
21、install 将包安装至本地仓库,以让其它项目依赖。
22、deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
Site Lifecycle生成项目报告,站点,发布站点
1、pre-site 执行一些需要在生成站点文档之前完成的工作
2、site 生成项目的站点文档
3、post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
4、site-deploy 将生成的站点文档部署到特定的服务器上
注意的是:为了统一管理版本号,可以使用properties标签,里面可以自定义版本的标签名。在使用的地方使用${自定义标签名}