1.目前掌握的技术
2.目前的技术在开发中存在的问题【why】
-
- 一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。
解决方法:借助Maven就可以将一个项目拆分成多个工程。
-
- 项目中需要的jar包必须手动"复制"、 “粘贴”到WEB-INF/lib目录下
带来的问题:同样的jar包重复出现在不同的项目工程中,一方面浪费存储空间,另一方面也会让项目工程比较臃肿。
解决方法:借助于Maven,可以将jar包仅仅保存在"仓库“中,有需要的使用的工程“引用”这个文件接口,并不需要真的把jar包复制过来。
-
- jar包需要别人替我们准备好,或者到官网下载
不同技术的官网提供jar包下载的形式是不同的。
有些技术的官网就是通过Maven或者SVN等专门的工具来提供下载的。
非官方方式下载的jar包,其中的内容可能是不规范的。
解决办法:借助于Maven我们可以以一种规范的方式下载jar包,因为所有知名框架或者第三方工具的jar包已经按照统一的规范存放在了Maven的中央仓库中。所以,以规范的方式下载的jar包,内容也是可靠的。
-
- 一个jar包依赖的其他jar包需要自己手动加入到项目中
文件的上传需要File Upload组件—>IO组件。相互依赖的jar包,如A.jar需要依赖于B.jar,当导入A.jar包时,maven会自动导入B.jar。
3. Maven是什么【what】
-
- Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model):项目对象模型
1. Maven是一款服务于java平台的自动化构建工具。(Maven本身也是Java写的)
Make ——> Ant ——> Maven ——> Gradle
2.构建
-
-
- 概念:以“Java源文件”、“框架的配置文件”、“JSP”、“HTML”、“图片”等资源为“原材料”,去“生产”一个可以运行的项目的过程。
- 编译
- 部署
- 搭建
- 编译:Java源文件[User.java]——>编译——>Class字节码文件[User.class]——>交给虚拟机JVM去执行。
- 部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程”编译的结果“。
- 生的鸡——>处理——>熟的鸡
- 动态Web工程——>编译、部署——>编译结果
- 构建过程中的各个环节
- 概念:以“Java源文件”、“框架的配置文件”、“JSP”、“HTML”、“图片”等资源为“原材料”,去“生产”一个可以运行的项目的过程。
-
-
-
-
- 清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
- 编译:将Java源程序编译成为class字节码文件
- 测试:自动测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态Web工程打war包,Java工程打jar包
- 安装:Maven特定的概念——将打包得到的文件复制到“仓库”中的指定位置
- 部署:将动态Web工程生成的war包复制到Servlet容器的制定目录下,使其可以运行
-
-
-
-
- 自动化构建
-
4.安装Maven核心程序
-
- 检查JAVA_HOME
- 解压Maven核心程序的压缩包,放在一个非中文无空格路径下
- 配置Maven相关的环境变量
- MAVEN_HOME或者M2_HOME
- path
5.Maven的核心概念:mvnrepository.com
-
- 约定的目录结构
- POM
- 坐标:
- Maven中的坐标用于描述仓库中资源的位置
- Maven坐标主要组成
- groupid:定义当前 Maven项目隶属于组织名称(通常是域名反写,例如:org.mybatis)
- artifactid:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
- version:定义当前项目版本号
- packaging:定义该项目的打包方式 (不属于Maven的坐标)
- 作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
- 依赖
- 依赖配置
- 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
- 格式:
- 依赖配置
<!-- 设置当前工程所依赖的所有jar-->
<dependencies>
<!-- 设置具体依赖-->
<dependency>
<!-- 依赖所属群组id-->
<groupId>junit</groupId>
<!-- 依赖所属项目id-->
<artifactId>junit</artifactId>
<!-- 依赖版本号-->
<version>4.11</version>
<!-- 作用域-->
<scope>test</scope>
</dependency>
</dependencies>
-
-
- 依赖传递
-
-
-
-
- 依赖具有传递性:
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源。
- 依赖具有传递性:
-
-
-
-
-
- 依赖传递冲突问题:
- 路径优先:当前依赖中出现相同资源时,层级越深,优先级越低,层级越浅,优先级越高。
- 声明优先:当资源在相同层级被依赖时,配置顺序靠后的覆盖配置顺序靠前的。
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
- 依赖传递冲突问题:
-
-
-
-
- 可选依赖
- 可选依赖指对外隐藏当前依赖的资源---不透明
- 可选依赖
-
<dependency>
<groupid>junit</groupid>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--可选依赖:不透明-->
<optional>true</optional>
</dependency>
-
-
- 排除依赖
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要
- 排除依赖
-
<dependency>
<groupid>junit</groupid>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 排除依赖-->
<exclusions>
<!-- 排除具体依赖-->
<exclusion> <groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion> </exclusions>
</dependency>
-
-
- 依赖范围
- 依赖的jar默认情况下可以在任何地方使用,可以通过scope标签设定其作用范围
- 作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件范围内)
- 是否参与打包(package指令范围内)
- 依赖范围
-
-
-
-
- 依赖范围的传递性:
- 带有依赖范围的资源再进行传递时,作用范围将会受到影响
- 依赖范围的传递性:
-
-
-
- 仓库(repository)
- 仓库用于存储资源,包含各种jar包
- 仓库的分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库资源
- 仓库(repository)
<localRepository>/Users/mahuan/Documents/programFile/maven-repository</localRepository>
-
-
-
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
-
-
<!-- 配置具体的仓库的下载镜像--> <mirror> <!-- (必填项)此镜像的唯一标识符,用来区分不同的mirror元素 --> <id>nexus-aliyun</id> <!-- (必填项)对哪种仓库进行镜像,简单来说就是代替哪个仓库 --> <mirrorOf>central</mirrorOf> <!-- (选填项)镜像名称--> <name>Nexus aliyun</name> <!-- (必填项)镜像URL--> <url>https://repo.maven.apache.org/maven2/</url> </mirror>
-
-
-
-
- 私服:部门/公司范围内存储资源的仓库,从中央仓库中获取资源
- 全局setting和用户setting的区别
- 全局setting定义了当前计算器中Maven的公共配置
- 用户setting定义了当前用户的配置(可以在自定义仓库外面再复制一个setting.xml,作用是比如自己公司有自己的私服,所以在这个XML文件中修改镜像的下载地址。
-
- 私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar
- 中央仓库的jar都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,仅对内部开放,不对外共享
- 保存具有版权的资源,包含购买或自主研发的jar
-
- 生命周期/插件/目标
- 构建生命周期
- 编译——>对测试代码编译——>测试——>打包——>安装;
- 构建生命周期
-
-
-
-
- Maven构建生命周期描述的是一次构建过程经历了多少个事件
- Maven对项目构建的生命周期分为三套
- clean:清理工作
- clean生命周期
- clean:清理工作
-
-
-
-
-
-
- default:核心工作,例如编译、测试、打包、部署等等
- defaylt生命周期
- default:核心工作,例如编译、测试、打包、部署等等
-
-
-
-
-
-
-
- site:产生报告,发布站点等
- site生命周期
- site:产生报告,发布站点等
-
-
-
-
-
- 插件(到Maven官网,查看插件功能)
- 插件与生命周期内的阶段进行绑定,在执行到对应生命周期时执行对应的插件功能
- 插件(到Maven官网,查看插件功能)
-
-
-
-
- 默认Maven在各个生命周期上绑定有预设功能
- 通过插件可以自定义其他功能
-
-
总结:生命周期表示几岁,插件表示对应几岁所干的那件事
-
- 继承
- 聚合
6.第一个Maven工程
-
- 创建约定的目录结构
-
-
- 根目录:工程名;
- src目录:源码;
- pom.xml文件:Maven工程的核心配置文件;
-
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 项目分组-->
<groupId>org.mh.example</groupId>
<!-- 项目名称-->
<artifactId>My_Study_Maven_A</artifactId>
<!-- 版本号-->
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target>
</properties>
</project>
-
-
- main目录:存放主程序;
- test目录:存放测试程序;
- Java目录:存放Java源文件;
- resource目录:存放框架或其他工具的配置文件;
-
-
- 为什么要遵守约定的目录结构?
- Maven要负责我们这个项目的自动化构建,以编译为列,Maven要想自动进行编译,那么它必须知道Java源文件保存在哪里。
- 如果我们自己自定义的东西想要让框架或工具知道,有两种办法:
- 以配置的方式明确告诉框架
- 为什么要遵守约定的目录结构?
classpath:spring-context.xml |
-
-
-
- 遵守框架内部已经存在的约定
-
-
log4j.properties log4j.xml |
约定 > 配置 > 编码
7.常用Maven命令
-
- 注意:执行与构建过程相关的Maven命令,必须进入pom.xml的目录
于构建过程相关:编译、测试、打包、....
-
- 常用命令
- mvn clean:清理
- mvn compile:编译主程序
- mvn test-complie:编译测试程序
- mvn test:执行测试
- mvn package:打包 ---- 包含了前面很多操作,它要确保要打包的项目没有问题。
- mvn install:安装到本地仓库 --- 将刚刚打包的jar包放入到本地仓库中去
- 常用命令
8.关于联网问题
-
- Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
- 当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
- 本地仓库的默认位置:[系统中当前用户的家目录:\.m2\repository]
- Maven核心程序如果在本地仓库找不到需要的插件,那么它会自动连接外网,到中央仓库去下载。
- 如果此时无法连接外网,则构建失败。
构建Web项目后的pom.xml文件的详细解释:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<!-- 指定pom的模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织id-->
<groupId>org.example</groupId>
<!-- 项目id-->
<artifactId>My_Study_Maven_Web_A</artifactId>
<!-- 版本号:release:完成版;sanapshot:开发版-->
<version>1.0-SNAPSHOT</version>
<!-- 打包方式:Java工程打jar包,Web工程打war包-->
<packaging>war</packaging>
<name>My_Study_Maven_Web_A Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!-- 工程的全部依赖-->
<dependencies>
<!-- 具体依赖-->
<dependency>
<!-- 组织id-->
<groupId>junit</groupId>
<!-- 项目id-->
<artifactId>junit</artifactId>
<!-- 版本号-->
<version>4.11</version>
<!-- 作用域-->
<scope>test</scope>
</dependency>
</dependencies>
<!-- 构建 -->
<build>
<!-- 设置插件-->
<plugins>
<!-- 具体的插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<!-- 设置端口-->
<configuration>
<!-- 端口号-->
<port>80</port>
<!-- 设置虚拟路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>