1.为什么使用Maven
① 可以模块化一个巨量的项目
② 便于我们规范化的统一管理jar包
2. Maven是什么
java语言编写的一种服务于java平台的自动化构建工具。(Make->>Ant->>Maven->>Gradle)
3. 三种工程的结构
① ecclipse中的显示的目录结构
② navigator透视图下的编译好的工程目录,相对于① 中的目录结构,多了一个javasource编译之后的.class文件(build)
③ 第三种是在web服务器上的工程目录,这个目录结构才是程序中使用到的相对路径和绝对路径。这个路径的特点是将①中的src中的东西放到了webcontent中的WEB-INF的lib目录下的classed文件中。
4.构建:编译+部署+搭建
以.class的java源文件,框架配置文件,jsp,html,图片等资源为原材料去生产一个可在WEB服务器上运行的项目的过程。
① 清理:将之前编译得到的旧的class字节码删除,为下一次编译做准备。
② 编译:将.java文件编译成.class文件。
③ 测试:自动的测试,提前准备好Junit让Maven命令自动去测试Junit程序。
④ 报告:测试程序Junit执行的结果。
⑤ 打包:动态WEB工程打成war包,java工程打成jar包。
⑥ 安装:Maven特定概念,将打包之后的文件复制到仓库中的指定位置。
⑦ 部署:将动态WEB工程生成的war包复制到Servlet容器(WEB服务器)的指定目录下,使其可以运行。
5. 如何修改框架的内容
① 以配置的方式告诉框架:如在web.xml中配置applicationContext.xml的位置。
② 遵循框架内部已经存在的约定:如log4j日志并没有任何配置文件,而是log4j框架在程序启动后会自动检测。
在项目技术选型的过程中,需要注意的是,同一个功能,如果可以使用框架约定的方式最优,二是可以使用框架配置的方式,最后才是使用在程序中编码的方式。
6. Maven的核心pox.xml文件
① pom:project--object--model文件对象模型。
② pom.xml是Maven的核心,与Maven构建相关的所有的设置都在这个pom.xml文件中。
7. 坐标
① 坐标的作用是在本地仓库中唯一的定位一个Maven工程,这个工程可以是jar包。
② 形式:gav:groupId--artifactId--version
③ 因为每一个工程都只有一个pom.xml文件,其中的每一个dependency节点都会依赖一个jar包。
8. Maven仓库
① 顾名思义,仓库的作用就是存储某些jar包
② 分类:本地仓库,可在eclipse中声明本地仓库的位置,通过配置本地仓库变量或者指定本地仓库的settings.xml的位置即可;中央仓库,需要联网去引用这些jar包,需要在pom.xml文件中声明中央仓库的uri和Id;中央仓库的镜像,作用是分担中央仓库的压力,提升用户的访问速度,用法和中央仓库一致。
③ 仓库中保存的东西都是Maven工程,包括:Maven自身构建所需的插件,第三方框架或工具的jar包;我们自己开发的Maven工程。
9. 依赖的范围
① 依赖的范围指的是pom.xml文件中所以来的jar包在哪种范围内是可以被依赖的。范围指定了当前jar在工程中的代码范围,注意这个范围指的是时间和空间的双向结合的范围。
② 分类:compile(默认),test,provided,system。compile指的是对主程序,测试程序都有效,且参与打包;test是指对主程序无效,仅对测试程序有效,而且不参与打包;provided是指对主程序和测试程序都有效,但是不参与打包。system系统范围指的是当前jar包不会从repository抓,而是从本地拿,配合systemPath使用。
③ 举例:servlet.jar必须设置成proovided,因为WEB服务器上已经存在,若也参与打包,那么运行起来的程序将会不知道去引用哪一个jar包。
④
10 . 生命周期
① 生命周期:必须按照各个构建环节的正确的执行顺序来执行。
② Maven核心程序定义了抽象的生命周期,如清理,编译,测试,报告,打包,部署,但是具体的工作交由插件来完成。
③ Maven程序为了更好的实现自动化构建的功能,生命周期中的任何步骤的实现都必须从最初的生命周期其实阶段开始执行。
11. 插件
生命周期的各个阶段的工作交由插件来执行。
12. Maven工具的使用
① 使用eclipse自带的Maven插件,需要在installations中勾选嵌入选项embeded,然后指定本地仓库的位置(两种方式)
② 使用解压包之后的Maven工具,即外置的Maven工具,在Installations中添加一个指向Maven文件夹的路径,然后再设定本地仓库的位置。需要注意的是,Maven和JDK再版本上有要求,需要匹配。
13. Maven工程的创建
14.Maven工程的导入
① 带有.classpath和.project的文件
② 带有pom.xml的文件
③ 可用existing project类型导入,因为它可以将代码复制到工作空间中,而Maven Project无法复制代码到工作空间中。
15.依赖的传递性
① Maven项目的依赖具有传递性,若A依赖于B,B依赖于C,那么Maven项目A自然依赖于C。
② Maven依赖传递的原则:线路就近原则和声明就近原则。
③ Maven依赖传递的范围:只能是compile范围的依赖才具有传递性,而test和provided(只能是编译期,不参与打包)范围的依赖不具有传递性,所以需要在每个Maven项目中都进行引用。
16.依赖的排除
若我们希望依赖某个jar包,而不希望由于依赖的传递性自动的依赖这个jar包依赖的jar包,此时我们可以使用exclusion节点作为dependency节点的子节点来手动的排除这些不想由于依赖的传递性而引入的jar包。
17.依赖的版本号的统一
若是在pom.xml文件中定义了许多的denpendency节点,那么此时的version节点就需要使用properties标签结合任取名称的自定义标签来声明这些版本号了。好处是若是想修改jar包以来的额版本号,就只需要修改properties标签中的自定义标签就可以了。
18.Maven的继承
例如对于junit的jar包的引用,因为test范围依赖的不可传递性,所以必须在每一个Maven工程中都加以引用,但是在真正的测试代码中不同的版本可能会导致异常,所以我们要创建一个pom父工程,然后让这些使用到test范围jar包的工程继承这个工程,同时在这个工程中声明test的jar包的版本,如此一来,我们就统一了test的jar包的版本。相当于对test范围的jar包添加了另一种传递性。
19.Maven的聚合
所谓聚合,就是将不同的程序放到同一个pom版本的程序中。聚合的好处是我们可以一键安装所有的聚合工程中的程序模块,而不用手动的一个一个的去install每一个程序。
常见问题
1.pom文件中,scope可以指定当前jar包的使用范围,如编译期,test,打包是否打入等等
optional可以指定当前jar包的引用工程,被其他包引用的时候,是否传递进去,true为传递