一、了解搭建私服的使用
仓库概念
中央仓库
目前来说: https://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中其他的都是镜像。
仓库镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像,使用镜像可以提高项目构建效率。
仓库的索引
中央仓库带有索引文件以方便用户对其进行搜索,索引每周更新一次,中央仓库的索引有几十M。
黑名单
如果某个IP地址恶意的下载中央仓库内容,例如全公司100台机器使用同一个IP反复下载,这个IP(甚至是IP段)会进入黑名单,因此稍有规模的使用Maven时,应该用Nexus架设私服。
私服
有些公司不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。
1.1 私服安装:
1. 在任意位置创建目录: nexus
2. 解压到nexus目录下会出现两个目录,两个目录都有用
注意:配置jdk1.8、再解压。不要安装有中文目录
配置文件说明
- 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口。
- 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间
再cmd里面启动:
- 私服的访问
1.2 私服仓库分类:
仓库类别 |
英文名称 |
功能 |
关联操作 |
宿主仓库 |
hosted |
保存自主研发+第三方资源 |
上传 |
代理仓库 |
proxy |
代理连接中央仓库 |
下载 |
仓库组 |
group |
为仓库编组简化下载操作 |
下载 |
1.3 私服的配置:
1.4 idea环境中资源上传与下载
上传:
- 本地仓库setting.xml文件配置 本地地址
F:/Maven/apache-maven-3.6.1
F:\Maven\apache-maven-3.6.1\conf
1.放到settings的<servers>标签里面
<server>
<id>release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
- idea中pom.xml文件配置
-
- 快照版本:1.0-SNAPSHOT ,如果稳定了要改为RELEASE版本。
- 导入配置命令,使用Maven命令:deploy部署。
2.放到模块的pom文件的<project>中
<distributionManagement>
<repository>
<id>release</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
-
- 在私服上面查看:
下载:
本地仓库访问私服权限设置 只能下载RELEASE版本。
- 配置私服位置Setting.xml :与上传中的service一致。
- 配置访问私服在Setting.xml文件中: 找到<mirror>标签,放内容到里面。
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
(注意❗配置后要改回原来阿里云的配置,上面的只是展示一下。)
- 直接编译一下即可:compile
二、理解传递依赖
2.1 依赖范围:
- maven有三种步同的类路径。
classpath范围 |
理解为 |
编译类路径 |
只在main目录下源代码起作用 |
测试类路径 |
只在test目录下起作用 |
运行时类路径 |
在运行的时候起作用,可以理解为会打包到target目录下 |
- 4种依赖范围:complile、provided、test、runtime 在运行状态的会产生依赖关系。
依赖范围 |
main编译类路径 |
test测试类路径 |
target运行时类路径 |
举例 |
compile |
Y |
Y |
Y |
Log4j |
provided |
Y |
Y |
Servlet | |
runtime |
Y |
Y |
mysql | |
test |
Y |
junit |
2.2 依赖传递:
在运行时起作用时候,会产生依赖传递
什么是依赖传递
概念:某个项目依赖了另一个项目,另一个项目中jar包会不会传递到这个项目中来 。
2.3 依赖可选
1.依赖可选
前提是会产生依赖传递的两种情况
2.什么是可选依赖
1. A项目依赖了junit
2. B项目依赖了A项目
3. 根据依赖传递特性,默认情况下B项目会依赖junit
4. 我们可以在A项目通过可选依赖,让B项目不能依赖junit
3.配置方式
在A项目的依赖配置中,通过optional子标签进行配置。它有两个取值:
• true:是可选依赖,不进行依赖传递
• false:默认值,进行依赖传递。
我是A项目,由我决定要不要给你,我的地盘我做主
<optional>标签,true依赖步往后面传递;在父项目模块中定义:
2.4 依赖排除
1.什么是依赖排除
1. A项目依赖了junit
2. B项目依赖了A项目
3. 根据依赖传递特性,默认情况下B项目会依赖junit
4. 我们可以在B项目通过排除依赖,配置B项目不依赖junit
2. 配置步骤
通过在B项目中配置 exclusions标签进行配置
1. 在依赖A项目下的version标签下编写exclusions
2. exclusions中每个exclusion是一个要排除的jar包
3. 只需指定groupId和artifactId就可以了,不用指定version版本
你给我就要,我不是很没面子?我来决定要不要
已经产生依赖关系,有相同的依赖,可以排除:<exclusions>
三、掌握如何解决依赖冲突问题
3.1 依赖冲突
了解Maven处理规则。
- 两个直接依赖 ,采用后面的依赖:即4.13.1
- 一个直接一个间接,采用直接的依赖
- 两个间接(里面还包含着其他依赖):
可以在模块结构中查看依赖(dependence)
四、学习使用maven分模块方式构建工程
4.1 多环节配置与应用:
方便快速切换不同环境。
- 配置多环境
- jdbc.properties文件要:使用${ }绑定要修饰的变量。
- <profiles>标签:定义各种环境。
<activation>标签:定义激活哪个环境
- <build>标签:指定编译。定义一个插件进行编译。
配置好后启动编译:compile命令!在target目录下可以查看编译后的文件:jdbc.properties已经发生了变化
- 使用环境:使用maven命令
mvn compile -P 大写
<profiles>
<!--开发环境-->
<profile>
<id>maven_start</id> <!--要保证唯一-->
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--测试环境-->
<profile>
<id>maven</id>
<properties>
<jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
<build>
<resources>
<!-- 指定资源的配置 -->
<resource>
<!-- 必须指定resource所在的目录 -->
<directory>${basedir}/src/main/resources</directory>
<!-- 指定是否替换 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
4.2 继承
概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息
⚫ 作用
1. 抽取所有项目公用的配置信息,子项目继承父项目,子项目就可以直接使用父项目的公用的配置了
2. 依赖管理(版本锁定):锁定当前项目中各个子项目依赖的版本
⚫ 子项目的配置
在子工程中声明其父工程坐标与对应的位置
父类中的打包方式为pom
- 简单的实现:
写父类模块:
选择空,注意不要包含其他模块,
- 只有pom.xml
- 父类中的打包方式变化,变为POM
- 子类中多了一个parent标签。
- 父类中的依赖会直接继承到子类中。
点中父模块来创建子模块:
2.父类中版本锁定
<dependencyManagement>,父类中锁定依赖的版本:子类中可以不用写版本号。(愿望)
4.3 聚合
dependencyManagement元素
作用:一旦在父项目中使用了版本锁定,就是统一控制各个组件的版本。如果子项目继承父项目,父项目中版本锁定的包子项目是不能直接使用的。
如果要使用,需要在子项目添加依赖,但不需要指定版本号。
步骤
1. 在父项目中pom.xml
1). 配置dependencyManagement
2). 配置依赖spring-webmvc
3). 配置依赖spring-context
2. 此时在子项目pom.xml中并没有依赖任何包
1). 在子项目需要再配置一次依赖spring-context,子项目中不需要指定版本version,这时子项目中就有了依赖包了
2). 因为没有配置spring-webmvc,所以spring-webmvc的包并没有继承下来
⚫ 作用: 配置在父工程中,聚合用于快速构建maven工程,一次性构建多个项目/模块。
⚫ 注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关 。
<modules>标签:父类中保存了所有的儿子信息。操作父类相当于操作了所有的儿子。
4.4 分模块创建。
- 项目开发的三种不同方式:
- 传统开发:将这些业务集中在1个web项目中, 缺点是代码量大, 业务插拔不方便 。
- 模块开发:模块化开发业务清晰, 维护方便, 业务插拔较简单, 缺点是各模块间 仍然存在依赖
- 微服务:将各个业务拆分成多个独立的系统
- 案例:把之前的项目拆分多个模块
- 顺序是 实体类→dao→service→web模块
- 哪个包含就在哪个模块里面导入相应的依赖
- 在父模块中进行版本号抽取。
- 创建子模块
注意,模块之间的依赖关系: 如dao中需要pojo中的实体类,需要创建依赖。
- 把控制器转换为web模块——快捷键。
- 复制静态模块的时候不能复制到WEB-INF
- tomcat部署的是控制器control
五、小结
- idea环境中资源上传与下载
- maven依赖管理
- 使用maven分模块方式构建工程