Maven教程
一、Maven1.1 项目管理问题项目中jar包资源越来越多,jar包的管理越来越沉重。1.1.1 繁琐要为每个项目手动导入所需的jar,需要搜集全部jar1.1.2 复杂项目中的jar如果需要版本升级,就需要再重新搜集jar1.1.3 冗余相同的jar在不同的项目中保存了多份1.1.4 项目管理方案java项目需要一个统一的便捷的管理工具:Maven1.2 什么是MavenMaven这个单词来自
一、Maven
1.1 项目管理问题
项目中jar包资源越来越多,jar包的管理越来越沉重。
1.1.1 繁琐
要为每个项目手动导入所需的jar,需要搜集全部jar
1.1.2 复杂
项目中的jar如果需要版本升级,就需要再重新搜集jar
1.1.3 冗余
相同的jar在不同的项目中保存了多份
1.1.4 项目管理方案
java项目需要一个统一的便捷的管理工具:Maven
1.2 什么是Maven
Maven这个单词来自于意第绪语(犹太语),意为知识的积累.
Maven是一个基于项目对象模型(POM)的概念的纯java开发的开源的项目管理工具。主要用来管理java项目,进行依赖管理(jar包依赖管理)和项目构建(项目编译、打包、测试、部署)。此外还能分模块开发,提高开发效率。
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
1.3 Maven的作用
- 依赖管理
- 统一对jar包进行管理,避免从外部拷贝jar包,只需要从maven仓库中通过坐标获取,减小项目体积
- 项目构建
- maven提供一套对项目生命周期管理的标准。开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理:编译、测试、打包、部署、运行。
- 统一项目结构
- 拆分项目模块
二、 Maven安装和下载
2.1 下载
通过Maven官网进行下载http://maven.apache.org/download.cgi
2.2 所有版本
全部的maven版本地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/
2.3 Maven安装
2.3.1 解压
Maven解压即可使用
注意: 解压文件尽量不要放在含有中文或者特殊字符的目录下。
解压后,有如下目录:
bin:含有mvn运行的脚本
boot:含有plexus-classworlds类加载器框架,Maven 使用该框架加载自己的类库。
conf:含有settings.xml配置文件
lib:含有Maven运行时所需要的java类库
2.3.2 环境变量
系统变量:MAVEN_HOME =maven的解压路径
系统变量:path = %MAVEN_HOME%\bin
测试是否配置成功
三、Maven配置
3.1 配置maven本地仓库
maven的setting配置文件 (maven的安装目录下的conf文件夹下)
3.1.1 配置本地仓库的位置
3.1.2 配置公共仓库(阿里云的公共仓库)
<!--setting.xml中添加如下配置-->
<mirrors>
<mirror>
<id>aliyun</id>
<!-- 中心仓库的 mirror(镜像) -->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
3.2 JDK配置
在 标签中 增加 一个 标签,限定maven项目默认的jdk版本.
内容如下:
<profiles>
<!-- 在已有的profiles标签中添加profile标签 -->
<profile>
<id>myjdk</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<!-- 让增加的 profile生效 -->
<activeProfiles>
<activeProfile>myjdk</activeProfile>
</activeProfiles>
四、仓库
4.1 概念
- 存储依赖的地方,体现形式就是本地的一个目录。
- 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖。
4.2 仓库分类
仓库分类如下:
仓库分类 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3lIegcd-1620607712787)(image/仓库分类.jpg)] |
当需要依赖时,会从仓库中取查找,优先顺序为:
4.3 本地仓库
即在settings.xml 中配置的目录。
使用过了的依赖都会自动存储在本地仓库中,后续可以复用。
4.4 远程仓库
4.4.1 中央仓库
- Maven 中央仓库是由 Maven 社区提供的仓库,不用任何配置,maven中内置了中央仓库的地址。
其中包含了绝大多数流行的开源Java构件。
- https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)
http://repo.maven.apache.org/maven2/ 中央仓库地址
4.4.2 公共仓库【重点
】
- 除中央仓库之外,还有其他远程仓库。
比如aliyun仓库(http://maven.aliyun.com/nexus/content/groups/public/)- 中央仓库在国外,下载依赖速度过慢,所以都会配置一个国内的公共仓库替代中央仓库。
<!--setting.xml中添加如下配置-->
<mirrors>
<mirror>
<id>aliyun</id>
<!-- 中心仓库的 mirror(镜像) -->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
4.4.3 私服【了解】
公司范围内共享的仓库,不对外开放。
可以通过 Nexus来创建、管理一个私服。
五、IDEA中使用Maven
5.1 maven 关联IDEA
在idea中关联本地安装的maven,后续就可以通过idea使用maven,管理项目啦。
全局设置:File ---- > other setting ----> setting for new Projects
5.2 使用maven创建Java工程
5.3 Maven项目的结构
5.4 使用Maven创建Web工程
5.4.1 通过java项目改造成Web项目
- 1、将项目的打包方式改为war
- 2、手动添加webapp目录、WEB-INF目录、web.xml配置文件
使用Maven创建的Web工程缺少WEB-INF以及web.xml文件,需要自行补齐可以创建一个web.xml文件模板
5.4.2 使用骨架创建Web项目
- 1、补充java目录、resource目录、test目录(java、resource)
5.5 启动Web项目
5.5.1 打包到外部tomcat中运行
5.5.2 IDEA中添加tomcat运行
5.5.3 使用maven中tomcat插件运行
- pom中添加maven插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定端口 -->
<port>8888</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
- 配置maven启动
六、Maven的核心概念
6.1 坐标
6.1.1 Maven的坐标
在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器
Maven坐标主要组成(GAV) -确定一个jar在互联网位置
groupId:定义当前Maven组织名称(公司域名倒置)
artifactId:定义实际项目名称
version:定义当前项目的当前版本
6.1.2 查找坐标
访问http://www.mvnrepository.com或者http://search.maven.org/网站
6.2 依赖(了解)
6.2.1 依赖范围
依赖范围 | 编译 | 测试 | 运行 | 举例 |
---|---|---|---|---|
compile | √ | √ | √ | druid |
test | √ | junit | ||
provided | √ | √ | servlet-api | |
runtime | √ | √ | mysql |
- compile
- 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
- test
- 测试依赖范围。只对于测试classpath有效
- provided
- 已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效
- runtime
- 运行时提供。例如:jdbc驱动
<dependencies>
<dependency>
<groupId>com.qf</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 依赖范围 provided表示运行期无效,编译、测试期有效 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 依赖范围 测试期间有效。编译、运行期无效 -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<!-- 依赖范围 只在测试、运行期有效。编译期无效 -->
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
<!--依赖范围: 在编译、运行、测试都有效。默认选项-->
<scope>compile</scope>
</dependency>
</dependencies>
6.2.2 依赖传递
pro3 依赖pro2 ,pro2 依赖 pro1
pro3中可以使用pro2和pro1中的依赖(jar包)
如果pro1中的依赖是test或者provided,那么pro2和pro3无法使用pro1中依赖
6.2.3 依赖冲突
pro3 依赖pro2 ,pro2 依赖 pro1
如果pro2中有与pro1中相同的依赖,但是版本不一样,pro3优先依赖于pro2中的依赖
6.2.4 可选依赖
pro2 依赖 pro1
如果pro1中的依赖不想被pro2使用,可以将依赖设置为可选依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
<!-- 设置为可选依赖,依赖此工程的其他工程将无法依赖到此jar包-->
<optional>true</optional>
</dependency>
6.2.5 排除依赖
pro3 依赖pro2 ,pro2 依赖 pro1
pro3中可以排除对pro1的依赖
<dependency>
<groupId>org.example</groupId>
<artifactId>mavenproject02</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 排除依赖传递下来的依赖,可以写多个 -->
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
七、 Maven常用命令【生命周期】
7.1 命令说明
- mvn compile
完成编译操作
执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
- mvn clean
执行完毕后,会将target目录删除。
- mvn test
完成单元测试操作
执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
- mvn package
完成打包操作
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
- mvn install
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
- mvn deploy
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
7.2 使用Maven面板
- 在IDEA中使用插件执行maven命令
7.3 使用命令行
在IDEA中使用命令行执行maven命令
八、聚合工程
8.1 项目打包方式
jar:是为了创建java工程
war:是为了创建web工程
pom:就是在聚合工程中创建管理我们jar和war工程的管理类的工程
8.2 项目结构
- 创建shop(父工程pom)
- commons(通用模块jar)
- entity(实体类模块jar)
- dao(数据访问模块jar)
- service(业务逻辑模块jar)
- portal(前台系统模块war)
- manager(后台系统模块war)
依赖说明
dao 依赖 commons、entity
service 依赖 dao
portal 依赖 service
manager 依赖 service
项目结构 |
---|
8.3 父工程管理版本
统一管理依赖以及版本号
父工程的pom文件
<!-- 集中定义依赖版本号 -->
<properties>
<junit.version>4.12</junit.version>
<spring.version>5.2.2.RELEASE</spring.version>
<mybatis.version>3.5.6</mybatis.version>
<mysql.version>5.1.47</mysql.version>
<jackson.version>2.4.2</jackson.version>
<druid.version>1.0.9</druid.version>
<jstl.version>1.2</jstl.version>
</properties>
<!-- 管理jar包,不会引入 ,如果子工程需要哪些jar包,则具体地在子工程中引入,不需要写版本号-->
<dependencyManagement>
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程中的pom文件
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
九、私服【了解】
9.1 概念
- 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。
- 有了私服之后,当 Maven 需要下载依赖时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
- 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载,且每次下载完只能被自己使用,不能被其他开发人员使用
- 所谓私服就是一个服务器,但是不是本地层面的,是公司层面的,公司中所有的开发人员都在使用同一个私服
9.2 架构
无私服 | 有私服 |
---|---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQo4fN3X-1620607712802)(image/私服1.png)] | [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBgmlgQ2-1620607712803)(image/私服2.png)] |
我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用 Sonatype Nexus
9.3 Nexus安装【了解】
9.3.1 下载
- 官网:https://blog.sonatype.com/
- 下载地址:https://help.sonatype.com/repomanager2/download/download-archives---repository-manager-oss
9.3.2 安装
下载nexus-2.x-bundle.zip,解压即可
nexus安装目录 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RJHyEZ7i-1620607712804)(image/私服3.jpg)] |
9.4 启动【了解】
- 解压后在bin目录中执行:
- nexus install 在系统中安装nexus服务
- nexus uninstall 卸载nexus服务
- nexus start 启动服务
- nexus stop 停止服务
9.5 Nexus登录【了解】
访问私服:http://localhost:8081/nexus/
登录Nexus才可以使用Nexus管理功能 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEGZV4h7-1620607712804)(image/私服_login.jpg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4uYBiga-1620607712805)(image/私服_login2.jpg)] |
9.6 仓库列表【了解】
仓库类型 | 描述 |
---|---|
group | 包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件 |
hosted | 私服 服务器本地的仓库,其中存储诸多构件 |
proxy | 代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载 |
仓库名 | 描述 |
---|---|
Releases | 存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库 |
Snapshots | 对应不稳定的发布版本 |
3rd party | 存放中央仓库没有的 ,如ojdbc.jar,可以上传到私服的该库中 |
仓库列表 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S39fFq9n-1620607712806)(image/私服_list.jpg)] |
9.7 Maven配置私服 (搭建)【重点
】
在maven中配置私服,使得maven可以从私服上获取构件
9.7.1 仓库组
而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢 ?
私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件
仓库组 注意:proxy的仓库排序在最后 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcoZDmdf-1620607712806)(image/私服_deploy2.jpg)] |
9.7.2 Maven关联私服
配置settings.xml,设置私服地址、认证等信息
<servers>
<server>
<id>nexus-public</id> <!-- nexus的认证id -->
<username>admin</username> <!--nexus中的用户名密码-->
<password>admin123</password>
</server>
</servers>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
<id>nexus-public</id>
<!--name随便-->
<name>Nexus Release Snapshot Repository</name>
<!--地址是nexus中仓库组对应的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories> <!--插件仓库地址,各节点的含义和上面是一样的-->
<pluginRepository>
<!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
<id>nexus-public</id>
<!--地址是nexus中仓库组对应的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>yourjdk</activeProfile>
<!-- 使私服配置生效 -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
至此,Maven项目中需要依赖时,Maven会从私服中下载
9.8 Maven项目部署到私服
- 执行 :mvn deploy 即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar
- 但需要提前在项目的pom.xml中配置部署私服仓库位置,如下:
...
<dependencies>
.....
</dependencies>
<!-- 在项目的pom.xml中 配置私服的仓库地址,可以将项目打jar包部署到私服 -->
<distributionManagement>
<repository>
<id>nexus-public</id> <!-- nexus认证id -->
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-public</id> <!-- nexus认证id -->
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
注意:如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证
10、mybatis缓存
mybatis一共有两级缓存,分别是一级缓存和二级缓存。默认开启了一级缓存
10.1 一级缓存
一级缓存是mybatis中默认开启的
生命周期:在同一个SqlSession下
- 一级缓存何时生效
- 默认生效
- 一级缓存何时失效
- 1、两次查询使用不是同一个SqlSession
- 2、手动将缓存清空
- 3、当sqlSession关闭之后
- 4、当两次查询操作中间,如果执行了增删改的操作,缓存失效
10.2 二级缓存
mybatis中二级缓存是需要手动开启
生命周期: 二级缓存是在namespace级别
- 二级缓存生效:
- 1、在主配置文件中开启二级缓存
- 2、在mapper映射文件中添加标签
- 3、在查询之间,SqlSession需要提交
- 4、如果没有缓存配置,那么这个类需要实现序列化接口
- 二级缓存失效
- 1、当两次查询操作中间,如果执行了增删改的操作,二级缓存失效
开启二级缓存
<configuration>
<!-- 开启二级缓存(当前这个版本是默认开启的) -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
...
</configuration>
mapper映射配置缓存
<!--
eviction:缓存淘汰策略 FIFO(先进先出) LRU(最近最少使用)
flushInterval:缓存的刷新时间
size:缓存的大小
readOnly:缓存只读
-->
<cache eviction="LRU"
flushInterval="60000"
size="512"
readOnly="true"/>
11 、分页插件
11.1 概念
PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。
11.2 访问与下载
官方网站:https://pagehelper.github.io/
下载地址:https://github.com/pagehelper/Mybatis-PageHelper
11.3 开发步骤
11.3.1 引入依赖
pom.xml中引入PageHelper依赖。
<!-- 引入分页插件依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
11.3.2 配置MyBatis-config.xml
在MyBatis-config.xml中添加< plugins >。
<configuration>
<typeAliases></typeAliases>
<plugins>
<!-- 添加分页拦截器查询 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
<environments>...</environments>
</configuration>
11.3.3 PageHelper使用
@Test
public void test01() throws IOException {
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
SqlSessionFactory sf = sfb.build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession sqlSession = sf.openSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
//在查询之前执行!!!!
PageHelper.startPage(3,3);
List<Emp> empList = empMapper.getAll();
PageInfo pageInfo = new PageInfo(empList);
//empList.stream().forEach(System.out::println);
System.out.println(pageInfo);
}
11.4 PageInfo对象
PageInfo对象中包含了分页操作中的所有相关数据。
PageInfo结构图 |
---|
![]() |
11.4.1 PageInfo应用方式
使用PageInfo保存分页查询结果。
/**
* 分页插件(物理分页 (sql语句中添加limit))
* 1、导入pageHelper依赖
* 2、在mybatis核心配置文件中添加插件(配置分页拦截器)
* 3、在执行查询操作之前执行 PageHelper.startPage(当前页,每页条数)
* 4、如果要获取完整结果,创建一个PageInfo对象即可(PageInfo pageInfo = new PageInfo(empList);)
*/
//创建一个分页信息类
PageInfo<Product> pageInfo = new PageInfo<>(productList);
更多推荐
所有评论(0)