项目管理工具
项目代码: https://gitee.com/xuhx615/ssm.git
🍓maven
maven
的本质是一个项目管理工具,将项目开发和管理过程抽像成一个项目对象模型(pom
)
pom
结构:
🍓maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(
jar
包),避免资源之间的版本冲突问题 - 统一开发结构:提供标准的、统一的项目结构
🍓maven的基础概念
🍒仓库
用于存储资源,包含各种jar
包
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库
- 中央仓库:
maven
团队维护,存储所有开发的资源的仓库 - 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用:
- 保护具有版权的资源,包含购买或自主研发的
jar
包 - 一定范围内共享资源,仅对内部开放,不对外共享
- 保护具有版权的资源,包含购买或自主研发的
- 私服的作用:
- 中央仓库:
🍒坐标
maven
中的坐标是用于描述仓库中资源的位置,由机器去识别这个坐标,然后找到加载相应的资源,不需要人去识别
maven
坐标的组成:
groupId
:项目隶属组织的名称(必须)artifactId
:项目的名称(必须)version
:项目的版本号(必须)packaging
:项目的打包方式
🍓本地仓库配置
修改maven根目录下conf/settings.xml
<!--本地仓库路径-->
<localRepository>E:\maven\dsgMaven\repository</localRepository>
<!--获取资源的远程仓库地址(这里配置的阿里云的镜像地址,国内一般都使用这个作为中央仓库)-->
<mirror>
<!--镜像ID-->
<id>nexus-aliyun</id>
<!--对哪种仓库进行镜像,central表示中央仓库-->
<mirrorOf>central</mirrorOf>
<!--镜像名称-->
<name>Nexus aliyun</name>
<!--镜像地址-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
🍓maven命令
#编译项目(在项目根目录下执行,编译完后会生成一个target目录)
mvn compile
#清除编译(在项目根目录下执行,编译完后会删除编译生成的target目录)
mvn clean
#打包项目源程序(在项目根目录下执行,编译完后会生成一个target目录,并在target目录里产生一个打包完成的jar包文件,注意:这个jar包只包含源程序)
mvn package
#将打包完成的项目jar包添加到本地仓库中去
mvn install
🍓依赖传递
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源A如果依赖于资源B,当前项目间接依赖于资源B
🍒依赖传递的冲突问题
- 路径优先:当依赖中出现了相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当冲突的资源在相同层级时,且版本相同,配置顺序靠前的覆盖靠后的
- 特殊优先:当冲突的资源在相同层级时,且版本不同,配置顺序靠后的优先
🍓隐藏依赖
隐藏依赖指项目A被项目B所引用时,不想让项目B知道项目A引用了依赖C,可以在项目A的pom.xml
文件对应的依赖C中设置<optional>true</optional>
隐藏这个依赖C,项目A看不到这个间接依赖C,但它是真实存在的。
<dependency>
<groupId>cn.com.xxx</groupId>
<artifactId>C</artifactId>
<version>1.0.1</version>
<optional>true</optional> <!--true隐藏,默认值false-->
</dependency>
🍓排除依赖
排除依赖指项目A被项目B所引用时,项目A引用了依赖C,但是项目B不想引用间接依赖C,则可以在项目B的pom.xml
文件下设置排除这个间接依赖C
<dependency>
<groupId>cn.com.xuhx</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions> <!--排除项目A中的依赖C,注意这里不需要依赖C的版本-->
<exclusion>
<groupId>cn.com.xxx</groupId>
<artifactId>C</artifactId>
</exclusion>
</exclusions>
</dependency>
🍓依赖范围
依赖的jar
包默认情况可以在任何地方使用,可以通过scope
标签设定其作用范围
作用范围:
- 主程序范围有效(
main
文件夹范围内) - 测试程序范围有效(
test
文件夹范围内) - 是否参与打包(
package
指令范围内)
scope | 主代码 | 测试代码 | 打包 |
---|---|---|---|
compile (默认) | Y | Y | Y |
test | Y | ||
provided | Y | Y | |
runtime | Y |
🍒依赖范围的传递性
间接依赖\直接依赖 | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | test | provided | runtime |
test | ||||
provided | ||||
runtime | runtime | test | provided | runtime |
🍓maven的生命周期
validate
(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。initialize
(初始化) 初始化构建状态,比如设置属性值。generate-sources
(生成源代码) 生成包含在编译阶段中的任何源代码。process-sources
(处理源代码) 处理源代码,比如说,过滤任意值。generate-resources
(生成资源文件) 生成将会包含在项目包中的资源文件。process-resources
(处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。compile
(编译) 编译项目的源代码。process-classes
(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。generate-test-sources
(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。process-test-sources
(处理测试源代码) 处理测试源代码,比如说,过滤任意值。generate-test-resources
(生成测试资源文件) 为测试创建资源文件。process-test-resources
(处理测试资源文件) 复制和处理测试资源到目标目录。test-compile
(编译测试源码) 编译测试源代码到测试目标目录.process-test-classes
(处理测试类文件) 处理测试源码编译生成的文件。test
(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。prepare-package
(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。package
(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。pre-integration-test
(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。integration-test
(集成测试) 处理和部署项目到可以运行集成测试环境中。post-integration-test
(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。verify
(验证) 运行任意的检查来验证项目包有效且达到质量标准。install
(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。deploy
(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。
🍓maven插件
<build>
<!--打包的包名的名称-->
<finalName>webDemo</finalName>
<plugins>
<plugin>
<!--源码打包的插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<!--打什么包:jar:源码jar包;test-jar:测试代码jar包-->
<goal>jar</goal>
</goals>
<!--在什么生命周期阶段打包,generate-test-resources指在test阶段打包-->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
🍓分模块开发
🍓聚合
在ssm_pom.xml
文件中加入如下配置
<!--构建聚合的项目打包方式都是打成pom--->
<packaging>pom</packaging>
<modules>
<module>ssm_controller</module>
<module>ssm_service</module>
<module>ssm_dao</module>
<module>ssm_pojo</module>
</modules>
🍓继承
继承需要父子关系,父工程中不需要标注什么,但是子工程一定要标注父工程是谁
<parent>
<artifactId></artifactId>
<groupId></groupId>
<version></version>
</parent>
继承的最大作用可以实现版本控制
<!--依赖继承-->
<dependencyManagement>
<!---->
<dependencies>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependencies>
<dependencyManagement>
🍒继承的资源
groupId
:项目组ID
,项目坐标的核心元素version
:项目版本,项目坐标的核心因素description
:项目的描述信息organization
:项目的组织信息inceptionYear
:项目的创始年份url
:项目的URL
地址developers
:项目的开发者信息contributors
:项目的贡献者信息distributionManagement
:项目的部署配置issueManagement
:项目的缺陷跟踪系统信息ciManagement
:项目的持续集成系统信息scm
:项目的版本控制系统信息malilingLists
:项目的邮件列表信息properties
:自定义的Maven
属性dependencies
:项目的依赖配置dependencyManagement
:项目的依赖管理配置repositories
:项目的仓库配置build
:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等reporting
:包括项目的报告输出目录配置、报告插件配置等
🍒继承与聚合
- 作用:
- 聚合用于快速构建项目
- 继承用于快速配置
- 相同点:
- 聚合与继承的
pom.xml
文件打包方式均为pom
,可以将两种关系制作到同一个pom
文件中 - 聚合与继承均属于设计型模块,并无实际的模块内容
- 聚合与继承的
- 不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
🍒maven属性
<!--定义属性的值-->
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
</properties>
<!--调用格式-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
🍓版本管理
SNAPSHOT
(快照版本)- 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本
- 快照版本会随着开发的进展不断更新
RELEASE
(发布版本)- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。
🍓Nexus
Nexus
是Sonatype
公司的一款maven
私服产品
Nexus
下载地址:https://help.sonatype.com/repomanager3/product-information/download
🍒Nexus私服文件结构:
注意: 目录路径不能有中文,否则启动会报错
#启动nexus程序
PS E:\nexus\nexus-3.20.1-01\bin> .\nexus.exe /run
#浏览器访问,默认端口8081
localhost:8081
🍒仓库分类
- 宿主仓库
hosted
- 保存无法从中央仓库获取的资源
- 自主研发
- 第三方非开源项目
- 保存无法从中央仓库获取的资源
- 代理仓库
proxy
- 代理远程仓库,通过
nexus
访问其他公共仓库,例如中央仓库
- 代理远程仓库,通过
- 仓库组
group
- 将若干个仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
🍒界面使用
- 初次登陆要去对应的路径寻找密码,使用admin登陆并修改初始密码,不需要勾选匿名登录
- 浏览设置
- 仓库分类
🍅创建宿主仓库
🍅将创建的宿主仓库放到maven-public组中
🍅手动上传资源
注意:非RELEASE
仓库不能手动上传
🍒以服务的形式运行
#安装nexus服务,注意:必须以管理员的身份打开PowerShell执行以下命令
.\nexus.exe /install
安装完成后会在服务列表看到nexus
服务
🍒本地仓库连接私服
复制本地仓库地址:
修改本地仓库配置文件setting.xml
<!--配置连接用户密码,id自定义保持唯一-->
<servers>
<server>
<id>xuhx_nexus</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
<mirrors>
<mirror>
<!--上面的用户密码的ID要与这边的id对应-->
<id>xuhx_nexus</id>
<mirrorOf>*</mirrorOf>
<name>xuhx_nexus</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
🍒上传本地仓库的依赖到私服
- 前往本地仓库文件夹的根路径下创建一个
xxx.sh
的脚本写入以下命令#!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name is important # Get command line params while getopts ":r:u:p:" opt; do case $opt in r) REPO_URL="$OPTARG" ;; u) USERNAME="$OPTARG" ;; p) PASSWORD="$OPTARG" ;; esac done find . -type f -not -path './mavenimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;
- 输入以下命令执行脚本,将本地依赖上传到你需要上传的宿主仓库中去,这里我上传的是默认仓库
maven-releases
.\xxx.sh -u admin -p admin -r http://localhost:8081/repository/maven-releases/
- 查看下页面有没有导入成功
🍒上传本地项目的jar包到服务器
- 配置好
maven
的settings.xml
- 在父工程pom.xml里面配置RELEASE和SNAPSHORT版本的jar包上传的仓库
<distributionManagement> <repository> <!--配置RELEASE包上传的仓库地址,注意id需要与settings.xml里面配置的用户密码对应的ID一致--> <id>xuhx_nexus</id> <url>http://localhost:8081/repository/xuhx_RELEASE/</url> </repository> <snapshotRepository> <!--配置RELEASE包上传的仓库地址,注意id需要与settings.xml里面配置的用户密码对应的ID一致--> <id>xuhx_nexus</id> <url>http://localhost:8081/repository/xuhx_SNAPSHOT/</url> </snapshotRepository> </distributionManagement>
- 点击下面的按钮发布项目到远程仓库