目录
一、Maven复习
1. Maven基本概念
1 Maven的作用
2 Maven的仓库
3 坐标的概念
2. Maven安装配置
3. Maven构建项目
4. Maven依赖管理
5. Maven依赖传递
二、工程分模块开发
1. 分模块开发介绍
2. 工程分模块示例
(1) 创建父工程
(2) 创建pojo模块步骤
(3) 创建utils模块
(4) 创建tlias-management模块
测试
3. 聚合与继承
1 聚合
2 聚合语法
3 继承
4. 版本锁定
1 版本锁定
2 定义properties
三、Maven私服
1. 什么是maven私服
2. 搭建maven私服
1 解压nexus程序包
2 启动nexus
3 进入nexus管理界面
3. 发布jar包到私服
1 配置私服地址
2 配置私服帐号和密码
3 把项目发布到私服
4. 从私服下载jar包
1 配置私服地址
2 测试效果
一、Maven复习
1. Maven基本概念
1 Maven的作用
Maven是Apache提供的一个项目管理工具
Maven的作用:
-
可以帮我们管理依赖
这里的“依赖”,通常指的是jar包,也可以是一个Module(一个Module完全可以被打包成jar)
可以减少jar包的多次拷贝,导致的重复
可以辅助我们分析jar包之间的依赖关系,当出现依赖冲突时,解决起来相对容易一些
maven自动帮我们下载jar包,不需要我们自己查找、下载了
-
可以帮我们构建项目
“构建”是一个项目代码编写之后,所经历的一系列的编译、测试、打包、安装、发布等等一系列的过程
如果没有idea,要构建一个项目是非常麻烦的
而如果有maven软件,只要通过简单的maven命令就可以实现项目构建了
-
可以实现项目的分模块开发
项目可以分模块,就具备了开发大型项目的条件了
2 Maven的仓库
Maven的仓库:指的是jar包的仓库。maven始终从本地仓库里加载jar包
-
本地仓库
-
私服
-
中央仓库
3 坐标的概念
什么是坐标:用于精准定位到一个jar包的标识,可以理解为jar包的唯一标识
注意:被maven管理的所有jar包、工程、模块等等,都必须有坐标,而且坐标不能重复
坐标的组成:
-
groupId:通常是公司名、组织名 域名倒写。比如:com.jd, com.baidu, com.itheima
-
artifactId:通常是包名
-
version:通常是版本号,完全可以自定义。不约而同的有两种常见的后缀
1.0-SNAPSHOT:通常指的是 快照版本、不稳定版、尝鲜版
1.0-RELEASE:通常指的是发行版、稳定版
2. Maven安装配置
修改maven的settings.xml,配置阿里云仓库镜像:在==mirrors
标签内部==增加以下内容
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
3. Maven构建项目
通过一些命令实现项目的构建的:
-
mvn clean:用于清理之前编译的结果(删除target文件夹)
-
mvn compile:用于编译项目的,maven会把编译的结果,放到自动生成的target文件夹里
-
mvn test:用于批量执行所有的单元测试类和测试方法。要求
-
单元测试类名,必须以Test结尾。否则不会自动运行这个测试类的
-
单元测试方法名,建议以test开头。只是建议,即使不以test开头,也会被test命令正常执行
-
-
mvn package:用于打包。一个项目会被打成什么格式的包:
-
jar包:如果pom.xml里有
<packaging>jar<packaging>
,或者没有这个标签,都会打成jar包 -
war包:在不使用SpringBoot的情况下,我们开发的应用,都要打成war包,然后部署到Tomcat里才能够运行
-
-
mvn install:把打包之后的包文件,安装到本地仓库里
-
mvn deploy:把jar包发布到远程仓库里
4. Maven依赖管理
项目里要导入的jar包,只要在pom.xml配置坐标就可以了
<dependencies>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
<scope>配置依赖范围</scope>
</dependency>
</dependencies>
scope依赖范围:
-
compile:默认的,全范围有效。编译时有效(写代码时能用jar包里的类),运行时有效,单元测试里有效
-
provided:编译时有效,运行时忽略。通常用于开发时必须提供,但是开发完成部署到生产环境时,生产环境里有这个包。比如Servlet包
-
runtime:编译时忽略,运行时有效。比如数据库驱动包,写代码时如果没有驱动包,也不耽误写,但是程序运行时必须有驱动包
-
test:仅在单元测试时有效。比如spring-boot-starter-test可以设置为test范围有效
-
system:让maven引用仓库之外的本地的jar包
实际使用时:
-
绝大多数jar包都使用默认的依赖范围compile,全范围有效
-
单元测试相关的包,设置为test
5. Maven依赖传递
依赖传递:项目依赖于A,而A依赖于B,那么我们可以认为:项目也依赖于B
好处是:可以在pom.xml少写一些
坏处有:可能产生依赖冲突
-
项目-->A-->X1
-
项目-->B-->X2
-
项目引用的X,就出现了版本冲突
依赖冲突:maven有自动调解冲突的原则
-
最短路径优先。比如下面的例子,X2会生效
项目-->A-->B-->X1
项目-->C--X2
-
第一声明优先。如果路径长度相同,哪个依赖先声明,哪个依赖就生效
-
项目-->A-->X1
-
项目-->B-->X2
-
-
手动排除法:不依靠maven的自动调解
-
项目-->A-->X1。导入A的时候,可以手动排除掉X1不导入
-
项目-->B-->X2
-
二、工程分模块开发
1. 分模块开发介绍
-
一切功能,一切代码,一切业务模块全部放到一个项目里
-
不同功能代码之间的耦合性强。
-
不能对不同功能做针对性的增强。
-
2.把一个项目拆分成多个子系统
可以针对不同子系统,做针对性的增强
可以降低不同子系统之间的耦合性
问题:有重复类
3.把一个项目拆分成多个子系统,并且把重复类提取到公用Module里
可以针对不同子系统,做针对性的增强
可以降低不同子系统之间的耦合性
减少重复代码:哪个子系统需要使用公用模块里的类,只要在pom.xml里引用它的坐标就可以用了
2. 工程分模块示例
针对之前完成的tlias项目,改造成工程分模块的方式
项目的整体目录结构:
(1) 创建父工程
-
创建project,设置名称为
tlias-parent
-
创建后,删除src文件夹。因为父工程里不需要放代码
-
修改pom.xml,添加依赖如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
</parent>
<!--锁定版本号-->
<dependencyManagement>
<dependencies>
<!--锁定Mybatis起步依赖的版本号-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--锁定mysql驱动的版本号-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<!--锁定PageHelper起步依赖的版本号-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
<!--锁定FastJson的版本号-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
(2) 创建pojo模块步骤
-
在父工程tlias-parent上右键,新建Module,名称为
tlias-pojo
-
创建包
com.itheima.pojo
,把实体类拷贝到包里
步骤
-
在父工程tlias-parent上右键,新建Module,名称为
tlias-pojo
-
创建包
com.itheima.pojo
,把实体类拷贝到包里
(3) 创建utils模块
步骤
-
在父工程tlias-parent上右键,新建Module,名称为
tlias-utils
-
创建包
com.itheima.util
,把工具类拷贝到包里 -
修改pom.xml,添加依赖如下:
<dependencies>
<!--阿里云OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<!--JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(4) 创建tlias-management模块
步骤
-
在父工程
tlias-parent
上右键,新建Module,名称为tlias-managenent
-
创建包
com.itheima
,把剩余的包和类(除了pojo和util之外的)全部拷贝进来 -
修改pom.xml,添加依赖如下:
<dependencies>
<!--pojo依赖坐标-->
<dependency>
<groupId>org.example</groupId>
<artifactId>tlias-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--utils起步依赖-->
<dependency>
<groupId>org.example</groupId>
<artifactId>tlias-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--AOP起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!--PageHelper分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!--fastJSON-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
测试
运行tlias-management里的引导类,启动服务
启动nginx
打开浏览器访问 http://localhost:90,重新登录后测试功能
3. 聚合与继承
1 聚合
为什么要聚合:
项目开发通常是分组分模块开发, 每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比如: tlias-pojo、tlias-utils、tlias-management 三个模块最终会打一个独立的工程jar包运行。
聚合的特性:
-
通过Maven命令操作一个模块,会同时操作其聚合的所有子模块
2 聚合语法
3 继承
为什么要继承:
继承是为了消除重复。如果多个模块的pom.xml中都要相同的配置(例如编译版本、依赖版本锁定等),则提取到父模块的pom.xml中配置即可,就避免了重复配置。
继承的特性:
-
子模块继承父工程,可以直接使用父工程里的依赖
-
如果父工程和子模块都引入了同一个依赖,则子模块自己的生效
效果演示
父工程里导入了lombok,那么子模块里不需要再导lombok,就能直接使用
4. 版本锁定
1 版本锁定
版本锁定:可以在父工程或父模块里,提前使用<dependencyManagement>
锁定某些依赖的版本号。这样的话,子模块在真正引入依赖时,就不需要再写版本号了
好处:如果要修改某个依赖的版本号,只要去父工程的pom.xml修改锁定的版本号,之后所有的子模块里的依赖版本号就自动随之改变了
2 定义properties
说明:我们可以把pom.xml里的一些配置,提取到properties
标签里统一进行维护。在pom.xml要使用这些配置时,按照请求${标签名}
可以取值
三、Maven私服
注意:练习maven私服前,先把settings.xml复制一个副本作为备份;练习后再恢复回去,否则影响后续开发
1. 什么是maven私服
-
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服
-
私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
-
私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下图 :
私服的使用模式
2. 搭建maven私服
【文件我上传置顶了】
1 解压nexus程序包
2 启动nexus
进入nexus的nexus-3.39.0-01/bin目录下,双击 start.bat 即可启动nexus
注意:启动后不要关闭黑窗口
3 进入nexus管理界面
打开浏览器,输入地址 http://localhost:8081并回车。nexus的帐号密码是 admin/admin
点击左侧菜单栏的Browse,可以浏览nexus里的私服仓库
3. 发布jar包到私服
并不是任何人都可以随便把jar包发布到私服上的,那会造成私服混乱。所以如果要把一个项目,或者把一个jar包发布到私服上,需要提供私服的地址、帐号和密码。
1 配置私服地址
在项目的==父工程pom.xml==里配置私服的地址,如下:
<distributionManagement>
<!-- release版本的发布地址 -->
<repository>
<!-- 仓库名称 -->
<id>maven-releases</id>
<!-- 仓库地址 -->
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<!-- snapshot版本的发布地址 -->
<snapshotRepository>
<!-- 仓库名称 -->
<id>maven-snapshots</id>
<!-- 仓库地址 -->
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
2 配置私服帐号和密码
修改==maven的settings.xml==文件,在servers
标签内部添加如下内容
<!-- release仓库的帐号密码 -->
<server>
<!-- 仓库id,要和上一步配置仓库地址时的id相同 -->
<id>maven-releases</id>
<username>admin</username>
<password>admin</password>
</server>
<!-- snapshots仓库的帐号密码 -->
<server>
<!-- 仓库id,要和上一步配置仓库地址时的id相同 -->
<id>maven-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
3 把项目发布到私服
针对项目父工程,执行deploy命令,即可把项目发布到私服上
-
因为我们的项目坐标里,版本号后缀是
snapshot
,所以项目会发布到maven-snapshots仓库里
打开nexus的管理界面,找到maven-snapshots仓库,可以看到刚刚上传的jar包
4. 从私服下载jar包
要从私服里下载jar包到本地仓库,只要有私服的地址就可以了
1 配置私服地址
注意:如果之前配置了阿里云仓库镜像,需要把阿里云仓库镜像的配置删除掉或者注释掉
修改==maven的settings.xml==,找到其中的profiles
标签,在标签内部添加以下内容
<profile>
<id>allow-snapshots</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>maven-public</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
2 测试效果
找到maven本地仓库,删除tlias-pojo对应的jar包
找到任意一个maven工程,在pom.xml里添加tlias-pojo的依赖坐标,编译项目,会自动从私服上把tlias-pojo对应的jar下载到本地仓库里