01_自动化构建工具之Maven
- 目前技术中存在问题(为什么使用Maven):
- 一个项目就是一个工程:
- 缺陷:如果项目太过庞大,就不适合使用package来划分层次,最好是一个模块就是一个工程,利于分工协作。
- 解决:Maven可以将一个项目拆分成多个工程。
- 项目中所需要的jar包必须手动“复制”“粘贴”到WEB-INF/lib中:
- 缺陷:同样的jar包出现在不同的工程中,造成磁盘存储空间的浪费,同时造成工程臃肿。
- 决:借助Maven可以将jar包保存在仓库中,然后在项目中添加一个“引用”文件接口即可。
- jar包需要提前下载好,或者别人事先准备好:
- 缺陷:不同的官网提供jar包下载的方式不同,通过非官网下载则可能导致jar包不规范(收费、版本)。
- 解决:所有的jar包都在Mven的中央仓库中存储,可以使用规范的方式下载所需要的jar包。
- jar包需要手动添加依赖包
- 缺陷:jar包之间具有依赖性,如commons-filedupload.jar包依赖于commons-io.jar包,在使用这些jar包时,必须要 掌握其中的依赖关系。
- 解决:使用maven,会自动将依赖包导入到项目中。
- Maven是什么:
- ①.Maven是一款只针对Java平台的自动化构建工具
- 发展历程:Make→Ant→Maven→Gradle
- ②. 构建
- 概念:以“Java源文件”“框架配置文件”“jsp”“html”“图片”等资源文件为“原材料”,去“生产”一个可以 运行的项目的过程。
- 编译:Java源文件→编译→Class字节码文件→交给JVM去执行 。
- 部署:一个动态web项目最终运行的并不是项目本身,而是这个项目“编译的结果”。
- 构建:构建并不等于创建,构建就是以我们编写的Java文件、框架配置文件、国际化等资源文件、图片和jsp页面等 静态资源作为“原材料”,生产出一个可运行的项目的过程。
- ③.构建过程中的各个环节:
- 清理:将以前编译得到的旧的class字节码文件删除
- 编译:将Java文件编译为class字节码文件
- 测试:自动测试,自动调用JUnit程序
- 报告:将测试的结果打印出来
- 打包:动态Web工程打包为war,Java工程打包为jar
- 安装:Maven特定概念--将打包得到的文件复制到“仓库”指定位置
- 部署:将动态web工程打包而成的war包复制到servlet容器的指定目录下。
- Maven环境配置:
- Java环境变量配置
- 解压缩Maven压缩文件,并创建一个新的目录进行存放
- 配置Maven环境:
- 配置MAVEN_HOMT或M2_HOME:
.png)
- 配置Maven的path环境:
.png)
- 验证Maven安装是否成功:mvn -v,显示当前版本信息后则安装成功
- Maven的核心概念:
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
- .第一个Maven工程:
- 创建约定的目录结构:
- 根目录:工程名
- src目录:源码
- POM.xml文件:Maven工程的核心配置文件
- main目录:存放主程序
- test目录:存放测试程序
- java目录:存放Java源文件
- resources目录:存放框架或者其他工具的配置文件
- 为什么要遵守约定的目录结构?
- 为了自动化构建
- 常用命令:
- 注意:执行与构建过程相关的maven命令,必须进入pom.xml所在目录。与构建过程相关:编译、测试、打包......
- 常用命令:
- mvn clean:清理
- mvn compile:编译主程序
- mvn test-compile:编译测试程序
- mvn test:执行测试
- mvn package:打包
- mvn install:安装
- mvn site:生成站点
- 关于Maven联网问题:
- Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序
- 当我们使用的Maven命令需要用到一些别的插件时,Maven核心程序会先到电脑本地的仓库中寻找
- 本地仓库的默认位置为(c:\users\Administor\.m2\repository)
- Maven如果在本地仓库无法找到需要的插件,会自动连接外网在中央仓库中下载
- 如果无法联网,则构建会失败
- 修改默认本地仓库位置,可以让Maven核心程序到事先准备好的目录下寻找插件
- Maven解压目录\conf\setting.xml
- 在setting.xml中找到ocalRepository标签
- 将<localRepository>/path/to/local/repo</localRepository>
- 将标签中间的路径修改为早已准备好的maven仓库目录
- <localRepository>D:\Work\Environment\Maven\local</localRepository>
- POM文件
- 全拼:Project Object Model 项目对象模型
- Dom :Document Object Model 文档对象模型
- pom.xml文件是Maven的核心配置文件,与构建过程相关的一切设置都这pom.xml中进行
- 坐标:
- 数学中的坐标:
- 在平面中,使用x、y两个向量,可以在平面中确定唯一的一个点
- 在空间中,使用x、y、z三个向量可以在空间中确定唯一的一个点
- 在Maven中使用以下三个向量来确定唯一的Maven工程
- groupId:公司/组织域名倒序+项目名
- <groupId>pw.fengya.maven</groupId>
- artifactId:模块名
- <artifactId>Hello</artifactId>
- version:版本
- <version>1.0.0</version>
- 坐标与仓库中的路径的对应关系
- 仓库
- 仓库分类:
- 本地仓库:在当前电脑上部署的Maven仓库目录,只为当前电脑的Maven工程服务
- 远程仓库:
- 私服(Nexus):架设在局域网环境下,为当前局域网环境下的Maven工程服务
- 中央仓库:架设在Internet上,为全世界的Maven工程服务
- 中央仓库镜像:为了分担中央仓库的流量压力,提升用户访问速度
- 仓库中保存内容(Maven工程):
- Maven自身所需要的插件
- 第三方框架或工具所需jar包
- 自己开发的Maven工程
- 依赖
- Maven解析依赖信息时会到本地仓库中寻找被依赖的jar包
- 对于我们自己开发的Maven工程,使用mvn install命令后就可以进入仓库
- 依赖的取值:
- compile范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效有效
- 是否参与打包:参与
- test
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- eg:junit.jar
- provided:
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- eg:servlet-api.jar
- Maven生命周期:
- 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
- Maven的核心程序中定义了抽象的生命周期,生命周期各个阶段的具体任务由插件来完成
- Maven核心程序为了更好的实行自动化构建,按照这些特点来执行生命周期中的各个阶段:不论现在要执行生命周期中的哪一个阶段,都是从这个生命周期的最初开始执行。
- 在Eclipse中使用Maven插件
- Maven插件:Eclipse内置
- Maven插件设置:
- 在installation中添加自己本地的Maven仓库目录
- 在user setting中设置conf/setting.xml的位置
- 创建Maven工程:
- 创建Java工程,选择打包方式为jar
- 创建web工程,选择打包方式为war,并选中项目,选择properties,选择Project Facets,去掉Dynmic web Module,点击Apply,重新勾选,并勾选在src/main/webapp目录下创建web.xml
- jsp页面抛空指针异常,则可能是依赖范围问题,将socpe属性值改为provided
- 依赖[高级]:
- 依赖的传递性:
- 好处:可以传递的依赖不必再每个模块都进行声明,在“最下面”的工程中依赖一次即可
- 注意:只有compile范围的依赖可以进行传递
- 依赖的排除:
- 在某个项目中确实需要依赖某jar包,而其传递的依赖中可能有jar包并不稳定,所以需要排除
- 排除设置:
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
- 依赖的原则:
- 作用:解决模块jar包之间的冲突性问题
- 情景设定1:声明路径不同时,路径较短者优先
- 情景设定2:声明路径相同时,先声明者优先
- 此处路径相同指的是dependency标签的先后顺序
- 依赖版本管理:
- 情景设定:加入当前项目使用的spring版本为4.0.0,假如后期需要修改版本号为4.0.2时,不可能依靠手动修改
- 解决方案:在properties标签中使用自定自定义标签统一声明版本号
<properties>
<自定义标签名>版本号</自定义标签名>
</properties>
- 在需要同一版本的位置,使用${自定义标签名}声明引用的版本号
- 使用properties标签和自定义标签的方式并不是只适合于版本号的设定,也可以用于其他地方,类似于Java中的常量
- 继承:
- 现状:
- JavaProject01依赖的Junit版本:4.0
- JavaProject02依赖的Junit版本:4.0
- JavaProject03依赖的Junit版本:4.9
- 缺陷:由于test范围的依赖不能传递,所以必然会导致各模块版本不一致
- 需求:统一管理各个模块对于Junit的版本管理
- 解决思路:将Junit统一提取到“父”工程中,在子工程中声明Junit依赖时不指定版本,以父工程统一设定为准,也利于修改。
- 操作步骤:
- 创建一个Maven工程为父工程,注意:打包方式为pom

- 在子工程中声明对父工程的引用
- 将子工程中与父工程冲突的部分删掉
- 在父工程中统一对Junit的依赖
- 在子工程中删除对于Junit依赖的版本号

- 配置完成后,需要先安装父工程再安装子工程
- 聚合:
- 作用:一键自动安装各个模块工程
- 配置方式:在一个“总的聚合工程”中配置参与聚合的各个模块
.png)

- 使用方式:在聚合工程中run as 选择Maven install
01_自动化构建工具之Maven的更多相关文章
- 自动化构建工具maven
Maven是目前最流行的自动化构建工具,对于生产环境下多框架.多模块整合开发有重要作用.Maven 是一款在大型项目开发过程中不可或缺的重要工具. 一.什么是构建? 构建并不是创建,创建一个工程并不等 ...
- 浅谈maven自动化构建工具
转载https://blog.csdn.net/zxm1306192988/article/details/76209062 Maven是什么[what] 1.Maven 是 Apache 软件基金会 ...
- 玩转SpringBoot之MyBatisplus自动化构建工具
使用MyBatisplus自动化构建项目 为什么要用这个? 方便 因为之前那种方式让我用起来不爽了:mybatis逆向工程(MyBatis Generator) 能紧密的贴合mybatis,并且MyB ...
- Jenkins敏捷开发 自动化构建工具
一.序言 Jenkins 是一款自动化构建工具,能够基于 Maven 构建后端 Java 项目,也能够基于 nodejs 构建前端 vue 项目,并且有可视化 web 界面. 所谓自动化构建是按照一定 ...
- 高效使用Java构建工具,Maven篇|云效工程师指北
大家好,我是胡晓宇,目前在云效主要负责Flow流水线编排.任务调度与执行引擎相关的工作. 作为一个有多年Java开发测试工具链开发经验的CRUD专家,使用过所有主流的Java构建工具,对于如何高效使用 ...
- gulp自动化构建工具
gulp 自动化构建工具,实时监控.代码合并.压缩... http://www.gulpjs.com.cn/ 中文网 http://gulpjs.com/plugins/ 英文网 ...
- 前端自动化构建工具gulp的使用总结
前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...
- 前端开发自动化工作流工具,JavaScript自动化构建工具grunt、gulp、webpack介绍
前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为 ...
- 前端自动化构建工具——gulp
gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到 ...
随机推荐
- 查看centos版本及32还是64位
1.[root@mini1 ~]# cat /etc/issue 2.[root@mini1 ~]# cat /etc/redhat-release 查看位数: [root@mini1 ~]# g ...
- oracle11g导出表时会发现少表,空表导不出解决方案。
一:背景引入 oracle11g用exp命令导出数据库表时,有时会发现只导出了一部分表时而且不会报错,原因是有空表没有进行导出,之前一直没有找到方法于是用最笨的方法重新建这些空表,当然在我们实际当中表 ...
- [洛谷P1196][NOI2002]银河英雄传说 - 带偏移量的并查集(1)
Description 公元五八〇一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发 ...
- .net core 使用阿里云短信发送SMS
阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...
- Python系列之 - 装饰器
装饰器主要是用来对函数的操作,我们把定义的函数比作一个蛋糕的话,那么装饰器就是盒子,如果要吃蛋糕就先打开盒子.具体到程序中就是在函数外层又套了一层,套的那一层就是一个装饰器.这么说可能有点抽象,那么我 ...
- C#调用Python,报错No module named os
C#调用Python 环境:Windows 8.1,已经安装Python2.7(C:\Python27),配置了环境变量. 已经安装VS2013,VS2017 1.安装IronPython 下载地址h ...
- SQL类型注入
前言: 继续进行未完成的sql注入学习 今天学习了各类型注入.前来进行总结. 目录: 数字型注入 字符型注入 提交注注入 GET注入 POST注入 COOKIE注入 正文: 数字型注入:www.xxx ...
- Jenkins持续集成演示
1.去我们的仓库修改一下代码 为了节约时间,我直接在网页上改了. 我们把布局页的footer信息改一下: 然后提交. 2.切换到Jenkins可以看到已经在构建了 等待构建完成. 3.访问我们部署的地 ...
- [LeetCode] Prime Number of Set Bits in Binary Representation 二进制表示中的非零位个数为质数
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime ...
- localStorage学习总结
一.本地存储 在HTML5诞生之前,网站如果想在浏览器端存储数据,只能使用Cookie,使用Cookie有较多的限制. Cookie问题: 1.cookie大小限制在4K左右(各个浏览器不一致) 2. ...