Maven使用

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、如何解决依赖冲突

  1. 默认解决方案

第一声明者优先原则

在 pom 文件中定义依赖,以先声明的依赖为准。

路径近者优先原则

也就是:直接依赖大于依赖传递

  1. 排除依赖

可以使用exclusions标签将传递过来的依赖排除出去。

image-20210306172611359

作用:如果发生冲突,添加排除依赖的包的依赖不生效。

  1. 版本锁定

使用dependencyManagement标签进行版本声明,声明后添加依赖时就不必执行版本号了,一切以声明的版本为准。

语法如下:

image-20210306173115666

5.2 properties标签

image-20210306173220420

作用:由于可能有多个包的版本是一致的,这时就可以使用properties标签定义“全局变量”,properties中的子标签相当于变量名,有自己定义。然后就可以通过 ${xxx} 获取到定义的值了。

5.3 聚合工程

​ 在企业项目开发中,由于项目规模大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一 个大型的项目拆分为N多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用 常见的拆分方式有两种: 第一种:按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块,订 单模块,购物车模块等,每个模块对应就是一个maven工程 第二种:按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程 不管上面那种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一 管理和配置。

image-20210306174324010

被继承的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的文档](

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值