maven私服搭建+maven高级特性+ssm整合分层构建工程+travel案例核心点记录
Posted ahcfl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven私服搭建+maven高级特性+ssm整合分层构建工程+travel案例核心点记录相关的知识,希望对你有一定的参考价值。
文章目录
基础知识:
1maven是一款管理项目的工具
a.生命周期的管理,编译,测试,打包等等
b.依赖管理,插件管理
c.分模块构建
2.maven的坐标:用来引入依赖的
通过groupId+artifactId+version三者合一去仓库寻找依赖
3.maven的仓库
本地仓库:个人电脑上的仓库
私服: 第三方公司搭建的服务器
中央仓库: maven团队维护的
问题引入:
1.右侧爆红:
1.通过工具删除下载失败的资源(之前发过,但是需要编辑文件,修改文件中的路径是自己本地仓库的路径)
2.保持网络通畅(你们需要拔掉网线)
3.添加坐标配置,刷新,重新下载即可
2.atl+insert 快捷导入找不到依赖
一、私服搭建
1. 为什么搭建私服
问题:
1.我们公司开发了jar包,其他项目组如何使用?
2.公司不给我们开放网络,我们怎么下载依赖?
小结:
为什么搭建私服:
方便我们公司自己管理依赖。
nexus软件的安装
步骤:
1.解压
2.执行文件
解压:
私服配置文件中的端口号:
双击或者鼠标右击,管理员执行
启动成功:
2. 私服的使用
访问首页
浏览器输入地址:http://localhost:8081/nexus
登录
默认用户名和密码:
用户名:admin
秘密法:admin123
登录成功
仓库介绍
私服中仓库类型的介绍:
group:组,所有仓库的入口
hosted:宿主仓库,用于管理非中央仓库的依赖
proxy: 代理,中央仓库的代理
virtual: maven1版本的支持,不用。
仓库介绍:
Public Repositories: 仓库组,所有仓库的统一入口。
3rd party: 宿主仓库,用于存放中央仓库没有并且是第三方公司开发的jar。
Apache Snapshots: 代理仓库,apache仓库的代理
central: 代理仓库,中央仓库的代理
Central M1 shadow : maven1版本的支持,不管
Releases: 宿主仓库,用来存放我们自己开发的依赖的发行版
Snapshots: 宿主仓库,用来存放我们自己开大的依赖的快照版
发行版(正式发布会):解决了快照版出现的bug,不会频繁的更新。
快照版(抢先体验):一些bug,会频繁的更新bug
仓库类型:
私服中各种仓库 和 仓库之间的关系
快照版和发行版:
小结:
常见仓库类型:
group:组,所有仓库的入口
hosted:宿主仓库,用于管理非中央仓库的依赖
proxy: 代理,中央仓库的代理
私服中的常见仓库:
Public Repositories: 仓库组,所有仓库的统一入口。
3rd party: 宿主仓库,用于存放中央仓库没有并且是第三方公司开发的jar。
central: 代理仓库,中央仓库的代理
Releases: 宿主仓库,用来存放我们自己开发的依赖的发行版
Snapshots: 宿主仓库,用来存放我们自己开大的依赖的快照版
发行版(正式发布会):解决了快照版出现的bug,不会频繁的更新。
快照版(抢先体验):一些bug,会频繁的更新bug
从私服下载资源
演示步骤:
1.删除本地仓库中mysql依赖。
2.修改私服中central代理的远程仓库为阿里云
3.修改maven的settings配置文件中,配置私服为我们自己搭建的私服
4.打开工程,引入被删除的mysql依赖,
1.删除本地仓库中mysql依赖。
2.修改私服中central代理的远程仓库为阿里云
阿里云私服地址: http://maven.aliyun.com/nexus/content/groups/public
3.修改maven的settings配置文件中,配置私服为我们自己搭建的私服
4.打开工程,引入被删除的mysql依赖,
问题:
如果配置了阿里云,也连接了网络,但是就是下载不成功。
将资源上传到私服
第三方宿主仓库 (3rd party)
用于存放阿里云没有但是是第三方开发的jar包。
演示:
1.自定义一个依赖,打成jar包,代表第三方公司的依赖
2.上传到3rd party
3.开启一个工程,引入这个依赖
4.查看引入情况即可
演示:
1.自定义一个依赖,打成jar包,代表第三方公司的依赖
2.上传到3rd party
3.开启一个工程,引入这个依赖
4.查看引入情况即可
自定义快照版仓库
演示步骤:
1.自定开启maven工程,编写一个mylist工具类。并且打成jar包
2.在maven工程的settings.xml中配置远程仓库的登录用户名和密码
3.在maven的pom.xml中配置远程仓库的地址
4.deploy命令进行上传
5.再另起工程, 通过坐标引入
1.自定开启maven工程,编写一个mylist工具类。并且打成jar包
2.在maven工程的pom.xml中配置远程仓库的地址
<distributionManagement>
<!--当前项目版本后缀为:RELEASES的上传目录-->
<repository>
<id>releases</id>
<name>Internal Releases</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<!--当前项目版本后缀为:SNAPSHOT上传目录-->
<snapshotRepository>
<id>snapshots</id>
<name>Internal Snapshots</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
3.在maven的settings.xml中配置用户名和密码
<server>
<!-- 仓库的唯一标识, -->
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210623110438764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21tbW1tQ0pQ,size_16,color_FFFFFF,t_70
小结:
maven的settings.xml中配置用户名和密码时,仓库的唯一标识必须和maven的pom.xml的仓库的唯一标识一致。
问题1:
此处有一个问题:maven命令执行不成功。
因为我们maven的命令是依赖于maven的插件,本地仓库有插件,但是maven会去校验远程仓库是否有对应的插件。很明显,我们远程私服是自己刚搭建的,没有插件,所以命令执行失败。
解决办法:我们先删除本地的一个插件,然后在直接去执行命令,maven会自动校验远程,并且进行下载。
问题2:
pom.xml中配置如下内容
<repositories>
<repository>
<!-- 私服的id -->
<id>nexus</id>
<!-- 自己的私服的公共入口 -->
<url>http://192.168.14.69:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<!-- 允许从快照版仓库下载资源 -->
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
自定义发行版仓库
上传成功
其他公共私服地址
4、http://maven.aliyun.com/nexus/content/groups/public/ 阿里云 (强力推荐)
5.https://mirrors.huaweicloud.com/repository/maven/ (华为云)
7、http://repository.jboss.org/nexus/content/groups/public
二、maven高级
依赖范围
环境:
测试环境:test包下的代码
编译环境:书写java代码的环境。
运行环境:war+tomcat环境
依赖范围:
provide:作用于编译时和测试时,不做用于运行时。 例如servlet。因为tomcat已经提供了。
runtime: 作用于运行时和测试时,但是不作用于编译时。例如mysql驱动。
test:只需要作用于测试时。 例如junit
compile:默认值,作用于运行时,编译时,测试时。
绝大多数情况,依赖范围用的不好,只是造成资源的浪费,并不会有其他影响。
但是对于servlet的依赖范围,provide是必须要添加的,要不然会报错。
依赖传递
依赖传递:
如果A依赖于B,当我们引入依赖A的时候,maven会自动的引入A所依赖的B.
例如:
spring-context 依赖于spring-core等等。
所以我们引入spring-context,会自动的引入spring-core。
演示:
创建2个工程demo_01和demo_02,
demo_01依赖其他的jar包
demo_02依赖于demo_01.所以,根据传递依赖,demo_02也会依赖于其他jar包
依赖可选
A依赖于B,当我们引入A的时候,maven会自动的引入A所依赖的B。
对于我们来说,不一定需要B。所以如何解决。
1.依赖可选,A在引入B的时候,添加声明,B依赖是可选的。其他工程引入A的时候,就不会引入B了。
2.依赖排除,工程在引入A的时候,添加声明,不需要B依赖。所以就不会引入B依赖。
演示:
1.创建工程Demo_A,引入依赖Junit,配置依赖可选
2.创建工程Demo_B,引入工程Demo_A. 根据依赖传递,Demo_B应该自动的引入Junit.
1.1.创建工程Demo_A,引入依赖Junit,配置依赖可选,B工程引入A
2.A工程配置依赖可选
依赖排除
演示:
Demo_A工程直接引入junit,
Demo_B工程引入依赖Demo_A,Demo_B在引入Demo_A的时候,声明需要排除的依赖。
依赖冲突
Demo_A,Demo_B,Demo_C
Demo_A引入spring-context(5.0.6),依赖传递spring-core
Demo_B引入spring-core(4.1.2),
Demo_C引入Demo_A和Demo_B,Demo_C同时依赖spring-core的2个版本,版本冲突。
maven解决版本冲突的原则:
1.路径最短者优先。
2.路径相同,先声明者优先。
路径最短者优先演示:(ctrl+alt+u) 查看maven的依赖路径
路径相同先声明者优先
将Demo_A的依赖切换成spring-core的5.0.6的版本
三、ssm工程改造成分层构建
maven的继承和聚合是2个不一样的概念,此处我们分开讲,但是企业开发都是一起使用的。
maven的继承
为什么需要继承
java中的继承:用于抽取共性代码的
maven的继承:用于抽取公共配置的,例如:依赖。
maven的继承:
1.用于抽取公共配置
2.方便所有子工程的依赖版本的统一维护
3.父工程中,没有java代码。
maven继承的演示
步骤:
1.创建父工程Demo_parent,声明打包方式为pom.(idea工具做好了)
2.创建子工程Demo_child_A,通过标签声明父工程(idea工具做好了)
3.父工程引入依赖,mysql依赖
步骤:
1.创建父工程Demo_parent,声明打包方式为pom.(idea工具做好了)
2.创建子工程Demo_child_A,通过标签声明父工程(idea工具做好了)
此时继承相关配置,idea全部都自动配置好了
父工程打pom包
子工程中需要声明父工程
3.父工程引入依赖,mysql依赖
继承的一些应用
父工程中:
1.针对于所有子工程需要的依赖,才去<dependencies>中声明,方便所有子工程的继承。
2.非所有子工程需要的依赖,我们在<dependencyManagement>声明,只会锁定版本,不会真的引入
哪个子工程需要,再次编写坐标(不包含version)配置引入
3.所有依赖的版本统一在<properties>中声明。
4.插件也是上述管理操作
父工程配置:
<?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>com.itheima</groupId>
<artifactId>maven_parent</artifactId>
<!-- 父工程必须打pom包 -->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- 声明子模块-->
<modules>
<module>maven_child1</module>
<module>maven_child_user</module>
</modules>
<!--
maven中继承的实际应用:
强调:
1.maven的继承是用来抽取公共的配置的
2.父工程中没有java代码,只有一个pom.xml
继承的实际使用细节:
1.<dependencies>中,只会声明一些所有子工程都需要的依赖,例如:junit,或者一些其他工具包
2.对于非所有子模块需要的依赖,我们统一声明到<dependencyManagement>标签中,
用来锁定版本,然后子工程要用,再去引入即可。
3.针对于所有的依赖,或者插件,或者模块的版本号,我们统一的在<properties>中进行声明,统一管理。
-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
<!-- 依赖管理,只是用来锁定依赖的版本的,不会真的去引入依赖。一般都是用在父工程中的-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 依赖版本的统一管理-->
<mysql.version>5.1.38</mysql.version>
<junit.version>4.12</junit.version>
</properties>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- tomcat7插件,命令: mvn tomcat7:run -DskipTests -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>utf-8</uriEncoding>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
子工程配置
maven的聚合(多模块开发)
maven的聚合:多模块开发。
当我们的工程比较庞大的时候,此时我们一个开发者负责一个模块。
而我们之前的工程,所有的代码全部放在一起。此时也就意味着我哪怕负责单个模块,也需要将所有的代码拉取到本地。而且如果不小心动了其他模块的代码呢。
所以在针对于上述这些情况,我们针对我们的工程进行分模块构建,
例如:用户模块单独做成一个工程,订单模块单独做成一个工程,
A组负责用户模块的开发
B组负责订单模块的开发。
好处:
1.方便企业开发的分工合作
2.方便分布式项目的管理
说白了:maven的聚合就是将一个工程,拆分成多个工程进行管理。
如何拆分:
1.纵向拆分:
按照项目的层次结构进行拆分。service层作为一个模块,dao层作为一个模块。
2.横向拆分:
按照功能模块进行拆分,用户模块,订单模块,物流模块,支付模块
上述继承时,已经使用了聚合了。
父工程中自动添加了子模块的声明:
小结:
企业开发模块和继承一起使用
ssm工程分层构建
步骤:
1.按照层次结构去拆分:
1.ssm_parent: 父工程
2.ssm_web: web工程,包含了controller层
3.ssm_service: service层
4.ssm_dao:dao层
5.ssm_pojo:实体层
2. 设置工程的打包方式
父工程打pom包,web工程打war包,其他工程打jar包
3. 配置模块和模块之间的依赖关系
4. 移植代码
5.测试即可
步骤:
1.按照层次结构去拆分:
1.ssm_parent: 父工程
2.ssm_web: web工程,包含了controller层
3.ssm_service: service层
4.ssm_dao:dao层
5.ssm_pojo:实体层
2.设置工程的打包方式
父工程打pom包,web工程打war包,其他工程打jar包
3.配置模块和模块之间的依赖关系
dao依赖于pojo
service依赖于dao
web依赖于service
web工程需要的代码
4.移植代码
父工程的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itcast</groupId>
<artifactId>ssm_parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>ssm_pojo</module>
<module>ssm_dao</module>
<module>ssm_service</module>
<module>ssm_web</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 父工程声明所有子模块的版本号-->
<ssm.version>1.0-SNAPSHOT</ssm.version>
</properties>
<dependencies>
<!-- 驱动-->
<dependency>
<groupId>mysql</groupIddocker搭建maven私服(nexus3),整合springboot上传下载依赖