1. 为什么要使用maven?
①粘贴jar包的问题
[1]每一个工程都需要重复复制jar包
[2]协同开发,不同开发人员导入的jar包如果不一致会造成冲突
小明:4.0.0-Spring
小刚:4.1.1-Spring
Maven的解决方案:在所有工程中都加入jar包的引用,jar包本身在仓库中只有一份。各个工程引用的是同一个jar包,不容易产生不一致的问题。 |
②jar包是从哪来的呢?
[1]官网下载
[2]官方提供jar包有的时候就是通过Maven或SVN、Git等工具进行下载的
[3]国内社区:CSDN、ITEye、51Cto……
[4]以不规范的方式得到的jar包往往也是不规范的
Maven的解决方案:根据“依赖信息”自动从Maven中央仓库下载jar包。以规范的方式下载的jar包也一定是规范的。 |
根据关键词搜索依赖信息的网站:http://mvnrepository.com |
③jar包之间的依赖
[1]使用commons-fileupload组件,必须同时导入commons-io
[2]使用Spring的IOC容器相关jar包,必须同时导入commons-logging
……
Maven的解决办法:会自动将所有jar包依赖的其他jar包导入到工程中。 |
④项目与工程
[1]目前:一个项目就是一个Web工程
[2]实际生产环境下:一个项目由多个工程组成,工程之间通过Maven依赖关系联系到一起
●结论:Maven是必须要使用的!
2.什么是Maven?
①Maven是一款工作在Java平台上的自动化构建工具。
②构建工具的发展历程
Make→Ant(Another Neal Tools)→Maven→Gradle……
③构建:使用原材料生产产品的过程。
[1]原材料:Java源程序、配置文件、JSP文件、静态资源、资源文件……
[2]产品:一个可以在服务器端运行的项目
④构建过程的各个环节
[1]清理:删除旧的编译结果
[2]编译:将Java源程序编程成.class字节码文件
[3]测试:自动测试
[4]报告:自动测试的结果
[5]打包:Java工程生成jar包,Web工程生成war包
[6]安装:将Java工程放置到Maven仓库的指定目录下
[7]部署:将Web工程放置到Servlet容器的指定目录下,并启动服务器,使项目可以被访问
3.使用Maven
①安装Maven核心程序
[1]确认当前系统环境中正确配置了JAVA_HOME
C:\Windows\System32>echo %JAVA_HOME% D:\DevInstall\Java\jdk1.8.0_111 |
[2]解压“Maven核心程序.zip”到一个非中文没有空格的目录下
D:\DevInstall\apache-maven-3.2.2 |
[3]配置path环境变量
D:\DevInstall\apache-maven-3.2.2\bin |
[4]配置MAVEN_HOME环境变量
D:\DevInstall\apache-maven-3.2.2 |
[5]验证
C:\Users\Creathin>mvn -v Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T21:51:42+08:00) Maven home: D:\DevInstall\apache-maven-3.2.2\bin\.. Java version: 1.8.0_111, vendor: Oracle Corporation Java home: D:\DevInstall\Java\jdk1.8.0_111\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos" |
②常用Maven命令
编译:mvn compile
测试:mvn test
清理:mvn clean
打包:mvn package
安装:mvn install
注意:在命令行窗口中执行Maven命令一定要进入到pom.xml所在的目录
③Maven联网的问题
[1]Maven为什么有很多东西要下载?
Maven的核心程序中仅定义了抽象的生命周期,具体的工作都需要由插件来完成。而插件并不包含在Maven核心程序中。
[2]Maven到哪里查找需要的插件?
首先在默认的本地仓库中查找。
Default: ${user.home}/.m2/repository ${user.home}表示登录当前系统的用户的家目录 |
如果本地仓库中没有需要的插件,那么就连外网下载
下载下来以后,就自动保存到本地仓库中,以后再需要使用时就不用重新下载了
如果下载过程中联网失败,无法获取到需要的插件,那么构建将会失败
[3]能否避免大部分jar包的加载?可以,使用一个已经准备好的仓库即可
解压压缩包:Maven仓库.zip
修改本地仓库的路径:找到conf/settings.xml文件,修改localRepository标签的值
<localRepository>D:\RepMaven</localRepository> |
4.POM
①含义:Project Object Model 项目对象模型
DOM 文档对象模型
②作用:对当前Maven工程的构建方式进行详细配置。重要性相当于web.xml对于动态Web工程的意义。
5.约定的目录结构
①意义:自动化构建的必然要求。以编译为例,如果Maven不知道目标Java源程序的位置就无法执行编译。
②让框架或第三方工具找到我们自定义的资源,那么无非有两种方式
[1]以配置的方式明确告诉它
<init-param> <param-name>contextConfigLocation</param-name> <param-value>spring-mvc.xml</param-value> </init-param> |
[2]遵循它的约定
log4j.xml/log4j.properties |
③约定的目录结构含义
[1]src:存放源代码文件和配置文件
[2]main:存放主程序的相关资源
[3]test:存放测试程序的相关资源
[4]java:存放.java源程序文件
[5]resources:存放配置文件
6.仓库
①Maven的仓库分类
[1]本地仓库
[2]远程仓库
(1)私服:架设在局域网环境中,为局域网环境内的Maven工程服务
(2)中央仓库:为全世界所有Maven工程服务
(3)镜像服务器:为了分担中央仓库的访问压力,内容和中央仓库完全一样
②仓库中保存的Maven工程分类
[1]Maven自身需要使用的插件
[2]程序员自己开发的Maven工程
[3]第三方框架或工具的jar包
③结论:不管是上述哪一种类型的jar包,在Maven的仓库中都是按照同样的方式进行管理的,Maven提供了一种管理jar包的统一规范。
7.坐标
①数学中的概念
[1]在平面内,使用x、y两个向量,可以定位到平面内的任何一个点
[2]在空间中,使用x、y、z三个向量,可以定位空间中的任何一个点
②Maven的坐标
使用groupId、artifactId、version三个向量,在仓库中唯一定位一个Maven工程
<groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> |
[1]groupId:公司或组织域名倒序+项目名
<groupId>org.springframework</groupId> |
[2]artifactId:模块名称
<artifactId>spring-core</artifactId> |
[3]version:版本号
<version>4.0.0.RELEASE</version> |
Tips:版本号
RELEASE:正式版
SNAPSHOT:快照,一般不太稳定
③根据任何一个Maven工程的坐标生成对应jar包在仓库中的路径
<groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> |
路径:Maven仓库根目录/org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar |
④用途:在A工程中需要引用B工程时,使用B工程的坐标来进行定位。
8.依赖★
①HelloFriend会到本地仓库中查找依赖的Hello。
②依赖的范围
[1]scope标签的可选值
compile[默认值]
test
provided
……
[2]compile和test对比
(1)在test目录下的代码中可用使用以test范围引入的依赖,在main目录下不可以使用
(2)在main和test目录下都可用使用以compile范围引入的依赖
[3]compile和provided对比
provided范围的依赖通常用来导入服务器能够提供但是开发过程中没有的jar包。
③依赖的传递
[1]compile范围的依赖可以传递
[2]非compile范围的依赖不可以传递,所以用到非compile范围依赖的工程都需要单独专门导入才行
④依赖的排除
[1]应用的场合:要使用A jar包,但是又不想引入A依赖的其他jar包。
[2]排除前举例
[3]排除后举例
[4]排除的配置方式
<exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> |
9.生命周期
①概念:构建过程中各个环节执行的顺序。
②Maven中的三个内置生命周期
[1]Clean
[2]Site
[3]Default
③执行的特点:不管用户下达的是什么命令,Maven都是从当前生命周期最初的位置开始执行,直到完成命令的任务。也就是说:每一个Maven命令都会将当前生命周期中前面的各个环节执行到。
mvn compile maven-resources-plugin:2.6:resources maven-compiler-plugin:2.5.1:compile |
mvn test-compile maven-resources-plugin:2.6:resources maven-compiler-plugin:2.5.1:compile maven-resources-plugin:2.6:testResources maven-compiler-plugin:2.5.1:testCompile |
mvn test maven-resources-plugin:2.6:resources maven-compiler-plugin:2.5.1:compile maven-resources-plugin:2.6:testResources maven-compiler-plugin:2.5.1:testCompile maven-surefire-plugin:2.12.4:test 测试报告 |
mvn package …… |
mvn install |
④生命周期每次都从最初的位置开始执行是自动化构建的一个重要保证。
10.插件和目标
①生命周期中仅定义了抽象的构建环节,具体的构建任务是由具体的插件来完成的。
②生命周期中的每一个环节都和某个插件的目标相对应。
生命周期环节 | 插件目标 | 插件 |
compile | compile | maven-compiler-plugin |
test-compile | testCompile | maven-compiler-plugin |
11.在Eclipse中使用Maven
①Maven插件:从Kepler版本开始Eclipse内置了Maven插件。
②Maven插件的设置
[1]指定Maven核心程序的解压目录
[2]指定conf/settings.xml文件的位置
③创建Maven工程
[1]Java工程
[2]Web工程
※注意:Tomcat已经提供的jar包在使用时要通过provided范围引入。例如:servlet-api和jsp-api
④运行时环境
任何API,只要不是自己编写的,都必须在某一个运行时环境中才可以使用,否则就会报“Cannot be resolve to a type”错误。
Tips:tc_server插件使用方式
直接复制到Eclipse解压目录下的dropins目录下,重启Eclipse即可