-
目前的技术存在的问题(引入Maven的重要性)
-
一个项目就是一个工程;
-
如果项目非常庞大,就不再适合使用package来划分模块;最好是每一个模块对应一个工程,利于分工协作;
-
借助于Maven可以将一个项目拆分成多个工程;
-
-
项目中的jar包需要导入到WEB-INNF/lib目录下;
-
带来的问题:同样的jar重复的出现在不同的项目中,一方面浪费存储空间,工程也会臃肿;
-
借助Maven,可以将jar包仅仅保存在仓库中,有需要的工程引入这个文件接口,并不需要真的把jar包引入过来;
-
-
jar包需要别人替我们准备好,或者到官网下载;
-
不同技术的官网提供jar包的方式不同;
-
语言问题;
-
有些技术的官网直接通过Maven或者 来提供jar包;
-
非正规方式下载的jar包,其中的内容很可能不规范;
-
借助于Maven可以以一种规范的方式下载jar包,因为所有知名的框架或者第三方的jar包已经按照统一的规范放在了Maven的仓库中,因此jar包也是可靠的;
-
-
一个jar包依赖的其他jar包需要自己手动导入 ;
-
如果所有jar包之间的依赖关系都需要程序员了解,那么会极大的增加学习成本;
-
Maven会自动的将被依赖的jar包导入进来;
-
-
“统一的规范”非常重要;
Maven的概念
-
Maven是一款服务于Java平台的自动化构建工具;
-
Make→Ant→Maven→Gradle
-
-
构建
-
概念:以java源文件、框架的配置文件、JSP、HTML、CSS、JS、图片等资源为原材料的,去生产一个可以运行的项目的过程;
-
生产
-
部署
-
搭建
-
-
编译:Java源文件[User.java]→编译→Class字节码文件[User.class]→交给JVM执行 ;
-
部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程编译的结果;
-
运行时环境:是一组jar包的引用,不是jar包本身复制到工程中;
-
构建中的各个环节
-
清理:将以前编译得到的旧的字节码文件删除,为下一次编译做准备
-
编译:将Java源程序编译成Class字节码文件
-
测试:自动测试,自动调用junit程序
-
报告:测试程序执行的结果
-
打包:动态Web工程打war包,Java工程打jar包
-
安装:Maven特定的概念,是将打包得到的文件复制到仓库中的指定位置
-
部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行
-
-
自动化构建
安装Maven核心程序
-
检查JAVA_HOME环境变量
-
解压Maven核心程序压缩包,放在一个非中文、无空格的路径下;
-
配置Maven的环境变量
-
推荐配置Maven_HOME或M2_HOME(推荐)
-
-
-
配置PATH
-
验证:运行mvn-v命令查看Maven的版本
-
Maven的核心概念
-
约定的目录结构
-
POM
-
坐标
-
依赖
-
仓库
-
生命周期/插件/目标
-
继承
-
聚合
第一个Maven工程
-
创建约定的目录结构
-
根目录:工程名
-
sec:源码
-
pom.xml:Maven工程的核心配置文件
-
main目录:存放主程序
-
java目录:java源文件
-
resources目录:存放框架配置文件或者其他工具的配置文件
-
-
test目录:存放测试程序
-
java目录:java源文件
-
resources目录:存放框架配置文件或者其他工具的配置文件
-
-
-
为什么用规定的目录结构?
-
Maven要负责项目的自动化构建,以编译为例,Maven要想自动编译,它必须知道Java源文件保存在哪里;
-
自定义的内容使得框架或工具知道,必须使用规定的目录表结构或者以配置的方式明确告诉框架(工具);
-
约定>配置>编码;
-
常用Maven命令
-
注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录.
与构建过程相关:编译、测试、打包、......
-
常用命令
-
mvn clean:清理
-
mvn compile:编译主程序
-
mvn test-compile:编译测试程序
-
mvn test:执行测试
-
mvn package:打包
-
mvn instal:安装
-
mvn site:生成站点
-
联网问题
-
Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心流量中;
-
当我们执行的Maven命令需要用到某些插件时,会首先在本地仓库查找;
-
本地仓库的默认位置:[系统中当前的用户的家目录]\:m2\respsitory;
-
Maven核心程序在本地仓库找不到需要的插件,那么会自动连接外网,到中央仓库下载;
-
此时无法连接外网,则构建失败;
-
修改默认本地仓库的位置可以让Maven在事先准备好的仓库中查找插件;
-
找到Maven解压目录下的\conf\settings.xml
-
在文件中找到<localRepository>标签,修改为准备好的路径即可;
-
POM
-
含义:Project Object Model(项目对象模型)
-
DOM:Document Object Model 文档对象模型
-
-
pom.xml对于Maven工程是最核心配置文件,与构建相关的一切设置都在这个文件中进行配置,重要程度相当于web工程中的 web.xml
坐标
-
数学中的坐标:
-
在平面中使用X、Y两个量可以定位平面中的任何一个点;
-
在空间中使用X、Y两个量可以定位空间中的任何一个点;
-
-
Maven中的坐标
-
使用三个值来定义仓库中的一个Maven工程:
-
groupid:公司或者组织域名倒序+项目名
-
-
<groupid>com.shang.maven</groupid> |
-
-
-
artifactid:模块名
-
-
<artifactid>hello</artifactid> |
-
-
-
version:版本
-
-
<version>1.0.0</version> |
-
-
坐标与仓库中路径的对应关系
-
路径为:groupid/artifactid/version/artifactid-version.jar,其中groupid中的.要变成/
仓库
-
仓库的分类
-
本地仓库:当前电脑上部署的仓库目录,为当前电脑所有的指定Maven工程服务;
-
远程仓库
-
局域网(私服):搭建在局域网环境中,为局域网范围内的所有Maven工程服务;
-
-
-
-
中央仓库:为架设在Internet上,为世界上所有的Maven项目工程服务;
-
中央仓库镜像:为了分担中央仓库的流量,提升用户访问的速度,也可以减轻负担;
-
-
仓库中保存的内容:Maven工程
-
-
Maven自身所需要的插件
-
第三方框架或工具的jar包
-
自己开发的Maven工程
-
依赖
-
Maven解析依赖信息时会在本地仓库寻找被依赖的jar包
对于自己开发的Maven工程,使用install
命令安装后就可以进入仓库。
mvn install
-
依赖的范围<scope>
-
compile
-
对主程序是否有效:√
-
对测试程序是否有效:√
-
是否参与打包:√
-
-
test
-
对主程序是否有效:×
-
对测试程序是否有效:√
-
是否参与打包:×
-
典型的例子:
-
-
-
-
provided
-
-
-
-
对主程序有效
-
对测试程序有效
-
不参与打包,因此也不参与部署
-
典型的例子:Servlet-api.jar
-
-
生命周期
-
各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行;
-
Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的任务是由插件来完成的;
-
Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中的各个阶段:不管执行生命周期的哪一个阶段,都在此生命周期的第一个阶段开始;
-
插件和目标
-
生命周期的各个阶段仅仅定义了要执行的任务是什么;
-
各个阶段和插件的目标是对应的;
-
相似的目标由特定的插件来完成;
-
目标可以看做是调用插件功能的命令
-
在eclipse中使用Maven
-
Maven插件:Eclipse内置
-
Maven插件的设置
-
installations:指定Maven核心程序的位置。不建议使用插件自带的Maven程序而应该使用自己解压的程序;
-
user-settings:指定conf/settings.xml的位置,从而获取本地仓库的位置;
-
-
基本操作
-
创建Maven版的Java工程:勾选图中项目
-