5. Maven进阶
5.1 maven的依赖传递
1、什么是依赖传递
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖 B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
2、什么是依赖冲突
由于依赖传递现象的存在, 如spring-webmvc 依赖 spirng-beans-5.1.5,spring-aop 依赖 springbeans-5.1.6,但是发现 spirng-beans-5.1.5 加入到了工程中,而我们希望 spring-beans-5.1.6 加入工 程。这就造成了依赖冲突。
3、如何解决依赖冲突
- 默认解决方案
第一声明者优先原则
在 pom 文件中定义依赖,以先声明的依赖为准。
路径近者优先原则
也就是:直接依赖大于依赖传递
- 排除依赖
可以使用exclusions标签将传递过来的依赖排除出去。
作用:如果发生冲突,添加排除依赖的包的依赖不生效。
- 版本锁定
使用dependencyManagement标签进行版本声明,声明后添加依赖时就不必执行版本号了,一切以声明的版本为准。
语法如下:
5.2 properties标签
作用:由于可能有多个包的版本是一致的,这时就可以使用properties标签定义“全局变量”,properties中的子标签相当于变量名,有自己定义。然后就可以通过 ${xxx} 获取到定义的值了。
5.3 聚合工程
在企业项目开发中,由于项目规模大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一 个大型的项目拆分为N多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用 常见的拆分方式有两种: 第一种:按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块,订 单模块,购物车模块等,每个模块对应就是一个maven工程 第二种:按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程 不管上面那种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一 管理和配置。
被继承的maven工程通常称为父工程,父工程的打包方式必须为pom,所以我们区分某个maven_工程是否为父工程就看这个工程的
打包方式是否为pom。
继承其他maven父工程的工程通常称为子工程,在pom.xml文件中通过parent标签进行父工程的继承
子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。
工程的聚合
在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。 如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来 非常繁琐。这时就可以使用标签将这些工程统一聚合到maven父工程中,需要打包的时候,只需要在此 工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
1. 简介
常见的两种版本控制类型是什么?
集中式版本控制工具 和 分布式版本控制工具
Git与SVN的区别是什么?
Git分布式版本控制系统存在本地仓库,可以通过本地仓库实现版本控制。
2. 安装
百度搜索,官网下载即可,若速度较慢可以用https://npm.taobao.org/mirrors/git-for-windows/
3. git的基本使用
1、全局配置用户和邮箱。
# 设置全局用户名
git config --global user.name "your name"
# 设置邮箱
git config --global user.email "your email"
全局配置,信息将写入C盘用户目录下的 .gitconfig
文件中
git config --list # 可以查看配置信息
2、初始化本地仓库
git init
3、 查看当前文件状态
git status [-s]
有 -s
显示更加 简洁:
?? 表示未被追踪、A新文件被添加、M表示旧文件被修改、D表示被删除
红色表示新内容未被提交到暂存区,绿色表示已被提交到缓存区,提交到仓库后就不显示此文件了
4、将文件保存到暂存区
# 添加单个文件到暂存区
git add Readme.txt
# 将当前目录下所有修改添加到暂存区,除按照规则忽略的之外
git add .
注意:空文件不会被提交到暂存区
5、将暂存区中的文件提交到仓库
# 如果暂存区有文件,则将其中的文件提交到仓库
git commit
# 带评论提交,用于说明提交内容、变更、作用等
git commit -m 'your comments'
6、 查看提交历史记录
git log # 显示所有提交的历史记录
git log --pretty=oneline # 单行显示提交历史记录的内容
git reflog # 获取操作命令历史
注意:
log与reflog有本质区别。log获取的是提交的版本信息,版本回滚后无法获取到之后的版本信息;reflog获取的是操作的历史记录,此处的操作包括提交、克隆等,所以可以获取到回滚版本之后的版本信息,同样也是克隆后无法使用reflog查看之前提交的原因。
7、版本回退
# 会退到 commit_id 指定的提交版本
git reset --hard 'commit_id'
8、删除已提交文件
git rm Readme.md // 删除已经被提交过的 Readme.md
作用相当于:自己吧文件删了,然后git add
所以只能作用于已提交的文件。
此命令好像没啥子用,还不如自己删然后提交呢。
9、忽略文件列表
在工作区中创建 .gitignore
文件,在文件中指明要忽略的文件即可
如:
/lexiang/*/target/
* 表示通配,
target及其下的内容不会进行版本控制。
10、撤销修改
通过版本回退可以跳转到任意提交状态,但是往往还有一些其他需求,如:
1、进行一次小修改,修改前将工作区的更新添加到了暂存区,后来对修改不满意,要将工作区恢复成暂存区的状态
git restore .
# 或者
git checkout .
两者作用相同,都是将未暂存的修改进行撤销,也就是恢复到最后一次 add 的状态。若没有暂存记录,则回到最后一次提交的状态。
git restore --staged .
作用是:可以删除暂存区中的记录。
2、对所有的修改都不满意,要将状态恢复成最后一次提交的状态。
当然可以先清除暂存区,再撤销为暂存修改,这样就回到了最原始的状态。但是略显麻烦
git reset --hard HEAD
直接可以恢复到最后一次提交的状态。
注意:无论是版本跳转还是修改撤销,如上操作都对位跟踪的文件无效:
未跟踪文件是指刚创建出来,为进行暂存(add)的文件。
git clean -fd
git clean -nfd
删除任何为跟踪的文件及文件夹,若再加上参数n可以预显要删除那些文件。若加上x则表示连ignore的文件也一并删掉。
4. git分支操作
4.1 分支简介
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
master (生产) 分支 线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
test(测试)分支 从master创建的分支,一般作为测试部门的测试分支,进行预发测试。 测试完成后,需要合并到master分支,进行上线,中小规模项目可省略此分支;
develop(开发)分支 从test创建分支,如果开发没有test分支,是从master创建的分支,一般作为开发部门的主要开发 分支 如果没有其他并行开发不同期上线要求,都可以在此版本进行开发 阶段开发完成后,需要是合并到test分支继续测试,如果没有test分支,可直接合并到master分 支。
hotfix(bugfix)分支, 从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、 develop分支。
4.2 使用分支
1、查看分支
# 查看本地分支信息
git branch
# 查看相对详细的本地分支信息
git branch -v
# 查看包括远程仓库在内的分支信息
git branch -av
2、创建分支
# 新建一个名称为 dev 的分支
git branch dev
3、切换分支
# 新建完 dev 分支以后,通过该命令切换到 dev 分支
git checkout dev
创建切换一步完成:
# 新建 dev 分支,并切换到该分支上
git checkout -b dev
4、合并分支
# 切换回 master 分支
git checkout master
# 将 dev 分钟中的修改合并回 master 分支
git merge dev
若合并时产生冲突,解决冲突后需要git add .
然后提交 。
5、删除分支
# 删除 dev 分支
git branch -d dev
5. 远程仓库操作
5.1 绑定远程仓库
Github支持两种同步方式“https”和“ssh”。SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间 人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处 就是传输的数据是经过压缩的,所以可以加快传输的速度。
1、SSH方式:
第一步:生成公私钥:
gitbash中执行:ssh-keygen -t rsa
该命令会在用户目录下的 .ssh 文件夹中生成公钥和私钥,将公钥【xx.pub】中的内容全选复制到github的SSH and GPG keys中即可。
第二步:添加关联
在本地git仓库中执行:
git remote add orgin urlxxxxx
url 是github中对应仓库的 .git 链接。
2、https方式
使用Https方式需要每次输密码。
但是可以在绑定远程仓库时,这样写链接:
git remote add orgin https://用户名:密码@github.com/xxxxx/#####
但是这样密码中不能包含 : 和 @
其实就算不这样window好像也会自己记住用户名密码,第二次提交时有Window帮我们自动填写。
5.2 相关操作
1、查看与本地仓库关联的远程仓库
# 命令形式:
git remote -v
# origin ——仓库服务器的默认名称
2、添加远程仓库
# 为本地仓库添加远程仓库
git remote add origin urlxxxxxxx
3、推送内容
# 第一次推送时使用,可以简化后面的推送或者拉取命令使用
git push -u origin master
# 将本地 master 分支推送到 origin 远程分支
git push origin master
推送前需要先从远程仓库获取最新内容,但是pull过程中可能发生代码冲突,只能自己解决后再提交、推送。
4、 从远程仓库获取最新内
可以通过 git fetch 和 git pull 来获取远程仓库的内容。
git fetch 和 git pull 之间的区别:
git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。
git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge 。
示例:
git fetch origin master
git pull origin master
5、 从远程仓库克隆
如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓 库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你 执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
# 通过 https 协议,克隆 Github 上 git 仓库的源码
git clone https://github.com/lagou-zimu/repo1.git
# 通过 ssh 协议,克隆 Github 上 git 仓库的源码
git clone git@github.com:lagou-zimu/repo1.git
6. git中的中文乱码问题
-
git status文法显示中文名称
git config core.quotepath false
-
git log 中文显示不出来
git config --global i18n.commitencoding utf-8 --注释:该命令表示提交命令的时候使用utf-8编码集提交
git config --global i18n.logoutputencoding utf-8 --注释:该命令表示日志输出时使用utf-8编码集显示
set LESSCHARSET=utf-8 --注释:windows设置环境变量 LESS字符集为utf-8
export LESSCHARSET=utf-8 --注释:linux设置环境变量 LESS字符集为utf-8
1. MD5加密
简介:
MD5加密全称是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一 定的位运算,最终获取加密后的MD5字符串。
特点:
1、针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常 32位的16进制字符串);
2、其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解 开。
3、运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。(加盐:随机字 符串)
4、对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少 次,都是同样的结果。
Java中使用:
<!--MD5依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.3</version>
</dependency>
工具类
public class Md5 {
public final static String md5key = "Ms2";
/**
* MD5方法
* @param text 明文
* @param key 密钥
* @return 密文
* @throws Exception
*/
public static String md5(String text, String key) throws Exception {
//加密后的字符串
String encodeStr= DigestUtils.md5Hex(text+key);
System.out.println("MD5加密后的字符串为:encodeStr="+encodeStr);
return encodeStr;
}
/**
* MD5验证方法
* @param text 明文
* @param key 密钥
* @param md5 密文
* @return true/false
* @throws Exception
*/
public static boolean verify(String text, String key, String md5) throws
Exception {
//根据传入的密钥进行验证
String md5Text = md5(text, key);
if(md5Text.equalsIgnoreCase(md5))
{
System.out.println("MD5验证通过");
return true;
}
return false;
}
}
DigestUtils
在 org.apache.commons.codec.digest 包下,是一个加密算法的工具类,其中包含了多种加密算法,MD5只是其中之一,md5Hex( )方法的左右是将一个字符串或者一个输入流进行加密,其返回值为加密后的字符串,是一个32位的16进制字符串。
[commons-codec的文档](