Maven高级应用
1、Maven基础知识回顾:
- 两大核心功能:
- 依赖管理:(对jar包的管理)
- 一键构建:(5个命令)
- 对Tomcat进行集成的插件,可以不使用,直接使用tomcat
- 仓库的种类:
- 本地仓库
- 远程仓库【私服】
- 中央仓库【连网情况,本地自动在中央仓库下载jar包】
- 仓库之间的关系:
- 当启动Tomcat的时候,Maven工程通过pom.xml文件,去本地仓库找jar包
- 如果本地没有,默认情况 会在联网的情况下,会去中央仓库进行下载
- 在公司中如果本地没有,会先在私服中下载
- 如果私服没有jar包
- 在中央仓库下载到私服
- 在本地上传jar包到 私服 或者 安装到本地(今天会讲)
- maven常见命令
- clear 清理项目
- compile 对main目录下的项目编译
- test 对 src/test
和
src/main 进行编译 - package 对项目进行打包
- install 把打包好的项目安装到本地仓库
deploy 会把本地做好的项目(jar包),上传到私服,发布
- maven的生命周期对应的几个命令
- 清理生命周期(clear )
- 默认生命周期(compile 、test、package、install、deploy)
- 站点生命周期
2、案例:传统web工程做数据查询
(写好Dao层,把dao层用到的对象,添加到容器中,在建立service与spring之间的关系)
2.1 jar包冲突问题:
1、什么是jar包冲突??
- 当引入一个jar包的时候,他会把自己所依赖的其他的jar包进行导入
- 当引入两个不同版本的的不同jar包的时候,这两个jar包都会依赖同一个jar包,但是由于版本不同,该项目具体使用哪个依赖jar包,产生冲突
2、怎么解决jar包冲突问题??
-
方式一:
第一声明原则:
- 哪个jar包声明的在前面,使用该版本的依赖jar包
- 哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。先声明的jar包坐标下的依赖包,可以优先进入项目中。
可以把想使用的版本放到前面
-
方式二:
路径近者优先原则:
- 直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包。
- 传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去。
- 直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖包。
可以在把该依赖包直接导入一次
-
方式三:
-
直接排除法:
-
在导入jar的时候,去除掉不想依赖的版本jar包
-
使用 < exclusions>标签内写多个要排除的依赖jar包< exclusion>
-
在< exclusion>标签内部,不需要指定要排除的依赖jar包的版本号(根据其导入的jar可以确定)
-
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> <!--排出掉,不想引入的依赖jar包--> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency>
-
-
-
2.2 锁定jar包版本:
-
为什么要锁住??
-
maven工程是可以分父子依赖关系的。 凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。 比如: 当前A项目,被B项目依赖。那么我们A项目中所有jar包都会传递到B项目中。 B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖。 那么直接依赖的jar包就会把我们A项目传递过去的ssm的jar包覆盖掉。 为了防止以上情况的出现。我们可以把A项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中, 即便是有同名jar包直接依赖,也无法覆盖。
-
-
怎么锁??
-
通过< dependencyManagement>标签
-
该标签与写在< dependencies>外面
-
在该标签内部,添加要锁住的坐标
-
该标签只是锁住jar包,并不会把坐标添加到环境内,还需要有 < dependencies>导入jar包
-
<!-- 锁住jar包--> <dependencyManagement> <!-- 要锁住的多个jar--> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency> </dependencies> </dependencyManagement> <!-- 引入jar包--> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency> </dependencies>
-
2.3 统一管理jar包版本
-
在< properties> 标签内部,配置 版本的名称key(标签)和值value(标签值)
-
在写坐标的版本号的时候,可以通过el表达式 ${名},来引用其值
-
<!-- 统一管理jar包版本 --> <properties> <spring.version>5.0.2.RELEASE</spring.version> <log4j.version>1.2.12</log4j.version> </properties> <!-- 引入jar包--> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <!-- 通过el表达式,映入上面的值 --> <version>${spring.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies>
-
3、分模块构建工程
3.1 为什么要分模块构建工程
Maven工程的拆分和聚合的思想
3.2 理解继承与聚合(工程的模块化)
-
工程只能使用自己内部的资源,天生独立的
-
模块可以继承父类资源使用,可以与其他模块建立依赖关系
-
通常继承和聚合同时使用。
-
何为继承 ?
- 继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml文件中的内容存在重复,
- 比如:设置编译版本、锁定 spring的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。
-
何为聚合?
- 项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,
- 比如:dao、service、web 三个工程最终会打一个独立的war 运行。
-
案例:
-
将 SSM 工程拆分为多个模块开发:
- ssm_dao
- ssm_service
- ssm_web
-
怎么实现依赖 和 继承 ???
-
继承父工程的jar包等资源
- 子模块继承父工程是天生的的,不需要自己在配置
IDEA会在父工程中的pom.xml文件中自动生成子模块的信息
IDEA会在子工程中的pom.xml文件中自动生成继承的父工程信息
- 将父工程发布仓库,便于子工程的继承
- 子模块继承父工程是天生的的,不需要自己在配置
-
子模块之间的依赖关系
-
导入jar包的形式,把其他子模块导入进来
-
<!-- 在service模块中,引入dao模块的坐标 --> <dependencies> <dependency> <groupId>org.example</groupId> <artifactId>dao子工程</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
-
-
-
直接依赖 和 传递依赖 下来的包是否直接能用??看作用域
-
直接依赖:继承父类的关系、直接导入的包关系等等
-
传递依赖:通过导入的包而导入的需要的jar包
-
不写作用域 作用域默认是 compile
-
其实当实际的过程中,该包因为作用域的原因导致不能使用,不会再去修改其作用域,在该模块中直接在导入就可以了
-
-
3.3 分模块工程的三种启动方式
1、案例:
2、三种启动方式:
-
法一:maven的方式
运行父工程中的maven的Tomcat插件
-
法二:maven的方式
- 使用maven的方式启动web模块的Tomcat的run
- 前提:用到的service、dao的子模块,已经放到本地仓库
怎么把子模块打包到本地仓库
- 使用maven的方式启动web模块的Tomcat的run
-
法三:使用Tomcat
- 配置好Tomcat进行运行父工程或者web模块
4、私服
4.1 简介:
- 公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,
- 私服服务器即是公司内部的 maven 远程仓库,每个员工的电脑上安装 maven 软件并且连接私服务器,
- 员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
- 私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下图:
4.2 下载安装启动私服
- 了解就可以,公司自己会在相应的服务器上搭建私服
- 下载Nexus:
- 安装Nexus:
-
卸载Nexus:
- cmd 进入(cd) nexus 的 bin目录,执行:nexus.bat uninstall
- 在 window 服务列表 中,查看nexus 是否已被删除
-
启动 nexus:
-
访问nexus:
- 先查看nexus 的配置文件conf/nexus.properties,查看nexus 的访问端口配置(一般为8081)
- 登入http://localhost:8081/nexus/(私服)
- 默认账号:admin 密码: admin123
4.3 仓库的类型:
在浏览器上查看仓库
-
-
hosted 宿主仓库
- 部署自己的 jar 到这个类型的仓库,包括 releases 和 snapshot 两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
-
proxy 代理仓库
- 用于代理远程的公共仓库,如 maven 中央仓库,用户连接私服,私服自动去中央仓库下载 jar 包或者插件。
-
group 仓库组,
- 用来合并多个 hosted/proxy 仓库,通常我们配置自己的 maven 连接仓库组。
-
virtual(虚拟):
- 兼容 Maven1 版本的 jar 或者插件
-
在私服的安装目录下查看
-
nexus 仓库默认在 sonatype-work 目录中:
-
4.5 (重点)将项目发布到私服
-
配置客户端:
-
第一步:
-
需要在客户端即要发布项目的的电脑上配置 maven环境,并 修改 settings.xml文件,配置连接私服的用户和密码 。
-
此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致
-
<!--releases 连接发布版本项目仓库 --> <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <!--snapshots 连接测试版本项目仓库 --> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server>
-
-
第二步:
-
配置要发布项目的 pom.xml
-
配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,
-
如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot仓库
-
根据本项目pom.xml中version定义决定发布到哪个仓库,如果version定义为snapshot,执行deploy后查看nexus的snapshot仓库
-
<distributionManagement> <repository> <id>releases</id> <url>http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> <!--注意:pom.xml 这里<id> 和 settings.xml 配置 <id> 对应! -->
-
-
第三步:
执行要发布项目的 deploy 命令
-
4.6 从私服下载 jar
-
通常的下载过程:
- 没有配置 nexus 之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,
- 有了私服本地项目首先去本地仓库找 jar,如果没有找到则连接私服从私服下载 jar 包,
- 如果私服没有 jar 包私服同时作为代理服务器从中央仓库下载 jar 包,
- 这样做的好处是一方面由私服对公司项目的依赖 jar 包统一管理,一方面提高下载速度,
- 项目连接私服下载 jar 包的速度要比项目连接中央仓库的速度快的多。
-
管理仓库组:
- nexus中包括很多仓库
- hosted中存放的是企业自己发布的jar包及第三方公司的jar包
- proxy 中存放的是中央仓库的 jar
- 为了方便从私服下载 jar 包可以将多个仓库组成一个仓库组,每个工程需要连接私服的仓库组下载 jar 包。
- 配置仓库组:
-
在本地的Maven配置连接私服
-
客户端的 setting.xml 中配置私服的仓库,由于 setting.xml 中没有 repositories 的配置标签
需要使用 profile 定义仓库。
-
把下面内容放到setting.xml文件的profiles标签内部
-
<profile> <!--profile 的 id--> <id>dev</id> <repositories> <repository> <!--仓库 id,repositories 可以配置多个仓库,保证 id 不重复--> <id>nexus</id> 北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090 <!--仓库地址,即 nexus 仓库组的地址--> <url>http://localhost:8081/nexus/content/groups/public/</url> <!--是否下载 releases 构件--> <releases> <enabled>true</enabled> </releases> <!--是否下载 snapshots 构件--> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <!-- 插件仓库,maven 的运行依赖插件,也需要从私服下载插件 --> <pluginRepository> <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 --> <id>public</id> <name>Public Repositories</name> <url>http://localhost:8081/nexus/content/groups/public/</url> </pluginRepository> </pluginRepositories> </profile>
-
在profiles 标签外:
-
<!--激活 profile 定义的仓库 --> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
-
-
-
-
当需要下载jar包的时候,会去私服中下载
5、安装第三方jar包
先找到第三方jar包的提供的坐标
- 安装任何第三方的坐标,只需要坐标信息就好,执行下面的命令
5.1 安装第三方jar包到本地仓库
- 方法一:
- 可以先 CMD进入到 jar包所在位置(当前文件名)
- 运行:
- mvn install: install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile= fastjson-1.1.37.jar -Dpackaging=jar
- mvn install: install-file -DgroupId=项目组 -DartifactId=项目 -Dversion=版本 -Dfile= 文件名 -Dpackaging=打包方式(jar)
- 方法二:
- 打开cmd直接运行下面命令(文件的全路径名)
- 运行:
- mvn install: install-file -DgroupId=项目组 -DartifactId=项目 -Dversion=版本 -Dfile= 文件的全路径名 -Dpackaging=打包方式(jar)
- 安装好就可以根据提供的坐标在项目中使用该jar包
5.2 安装第三方jar包到私服
-
先在本地的Maven的setting配置文件中添加私服的第三方登入信息
-
<server> <id>thirdparty</id> <username>admin</username> <password>admin123</password> </server>
-
-
执行安装命令
-
执行下面的cmd命令
-
方式一:
-
在当前位置打开cmd
-
mvn deploy:deploy-file 文件形式安装 -DgroupId=com.alibaba 项目组 -DartifactId=fastjson 项目 -Dversion=1.1.37 版本号 -Dpackaging=jar 打包方式 -Dfile=fastjson-1.1.37.jar 文件名(在当前文件夹打开,直接写文件名) -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
-
-
方式二:
-
打开文件名,直接写全路径名
-
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=文件在当前客户端电脑的全路径名 -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
-
-