Maven&Git学习经验
各位读者朋友好,我是你们的好朋友IT黑铁,经过一段时间的学习,我这一次给大家分享Maven和Git的学习经验,如若有错还望指出,大家共同探讨!!
学习资料来源于黑马程序员的b站视频,下面附上链接,有需要的朋友可以查看。
Maven:黑马程序员Maven全套教程,maven项目管理从基础到高级,Java项目开发必会管理工具maven_哔哩哔哩_bilibili
Git:https://www.bilibili.com/video/BV1MU4y1Y7h5?p=1
Maven
(一)解决问题:
--依赖第三方资源的版本冲突。
--工程整体升级维护发布等过程的操作繁琐
(二)Maven是什么?
Maven是一个项目工程管理工具,将项目开发和管理过程抽象一个抽象模型(POM—项目对象模型)
(三)Maven的作用
---项目构建:提供跨平台、标准的自动化项目构建方式
---依赖管理:方便快捷的管理项目依赖的资源,避免资源间的版本冲突问题
---统一开发结构:提供标准的、统一的项目结构
(四)Maven的基本事项
---Maven基于Java语言,需要使用jdk,高级环境变量里设置Java的属性,而Maven只需配置MAVEN_HOME、Path。(带有_HOME的均配置为安装目录,Path为%XX_HOME%\bin)
---坐标:Maven中的坐标用于描述仓库中资源的位置(https://repo1.maven.org/maven2/)
Maven坐标主要组成:
groupId:定义当前Maven项目隶属组织名称(通常是域名反写)
artifactId:定义当前Maven项目名称(通常是模块名称)
version:定义当前项目版本号
package:不写默认打jar包,使用jsp技术打war包,html之类可选jar包。
properties:定义自定义属性
---中央仓库官网:(https://mvnrepository.com)
---Maven系统配置文件(settings.xml)设置:
*更改本地仓库默认位置
*设置镜像仓库(当访问中央仓库时访问阿里云)
*用户settings:将一个用户settings.xml放在本地仓库父目录下,不一样的话局部setting将会覆盖全局setting(conf目录里的setting)。
---Pom文件标签属性:
<modelVersion>---项目对象模型版本非maven版本
<name>---项目名称
<description>---项目描述
<profile>多环境开发
<id>
<properties>环境中使用的属性值
<activation>默认启动
<activeByDefault>
<dependency>---依赖jar包
Maven坐标
scope依赖范围
configuration(对应资源的配置属性,例tomcat的port,path)
<build>
<plugin>
插件坐标
configuration(对应资源的配置属性,例tomcat的port,path)
<resource>src资源
<directory>(设定配置文件对应的位置目录,支持使用属性动态设定路径)
<filtering>是否开启对管理资源的加载过滤
<testresources>测试资源
<distributionManagement>发布配置管理
<repository>realease仓库
<id>settings.xml私服仓库ID
<url>私服网址
<snapshotRepository>snapshot仓库
---mvn命令:
生命周期命令:mvn 生命周期
创建模板工程命令:
、--- 依赖管理
依赖具有传递性:直接依赖和间接依赖。
依赖传递冲突:与树一样的层级关系
路径优先(当依赖中出现相同资源时,优先层级越浅,优先级越高。)
声明优先(当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的)
特殊优先(当同级配置了相同资源不同版本,后配置的覆盖先配置的)
排除依赖与可选依赖:
optional(在原依赖项目中配置,不让别人发现)
exclusion(在自己的项目中配置,排除指定依赖)
依赖范围:
间接依赖后:
---项目构建与生命周期
clean生命周期
default构建生命周期
valitdate(校验)
initialsize(初始化)
package(打包)打包到当前项目目录下
install(上传)上传到本地仓库
verify(验证)
deploy(部署)上传到私服仓库中
site构建生命周期
添加所需生命周期插件(Maven官网插件里找)
(四)分模块开发与设计
目的:分工明确,提高开发效率,降低耦合度。
实现细节:模块中仅包含当前模块对应的功能类与配置文件
spring核心配置根据模块功能不同进行独立制作
当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用
Web.xml需要加载所有的spring核心配置文件
(五)模块聚合
解决问题:统一更新操作各模块的生命周期,方便操作。
具体操作:
(六)版本管理
属性及引用格式:自定义属性--${属性名}
内置属性--${project属性名}(project可省)
Setting文件属性:${settings.属性名}
Java系统属性:
${java.runtime.name}(System.getProperties或mvn help:system查询)
环境变量属性:${env.JAVA_HOME}(查询方式与上相同)
继承:
解决问题:各依赖模块之间的版本管理问题
具体操作:
注意:version一般使用自定义属性,方便修改!
版本管理:
(七)其他资源属性值的共享
目的:其他模块下的配置资源读取父模块下的属性值。
具体操作:先自定义属性和resource设置目录和过滤后(可使用内置属性basedir),其他模块下的资源通过${属性名}引用
(八)多环境开发配置
目的:在不同环境场景下使用不同的配置
具体操作:先使用profile标签定义完毕后,可以使用actication标签默认启动也可以使用mvn install -P 环境ID
(九)跳过测试
解决问题:由于不可抗力问题导致的跳过某些测试或是所有测试。
具体操作:
第一种:
第二种:
第三种:
(十)私服制作
Nexus---Sonatype公司的一款maven私服产品
操作流程:访问服务器,在work目录下找到密码admin文本登录,登录后可创建一个宿主仓库,创建仓库后,将需要的仓库都放到群组仓库中,方便获取。
IDEA访问私服:下载每个项目的本地仓库相同,在本地仓库配置一次就行。
IDEA私服上传:上传在每个项目中不同,需在不同的pom文件中配置。
Git
(一)解决问题:
---回溯项目版本(代码还原)
---备份
---协同开发
---追溯问题代码编写人和时间
---团队作战
---清晰看到每个功能变化,切换方便
---导入项目方便
(二) 版本控制历史
集中式版本控制工具:SVN和CVS
分布式版本控制工具:Git(linus开发的)
Git特点:
(三) 工作流程
(四)组成
Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具(小型的linux命令窗口)
标识用户:
用户名:git config –global user.name “itdaling”
邮箱:git config –global user.email “xxx@xxx”(不要求真实存在)
查看配置信息:
git config --global user.name
git config --global user.email
命令别名:解决常用不变命令过长的问题
创建.bashrc文件(由于有时win不允许创建.开头的,使用touch ~/.bashrc)
内容:alias git-log=’git log –pretty=online –all -graph –abbrev-commit’ 用于输出git提交日志
alias ll =’ls -al’ 输出当前目录所有文件及基本信息。
乱码问题:
.gitattributes文件
官网文档入口:Git - Git Attributes (git-scm.com)
瞎看了一通,这个文件的作用总结一下,自定义Git功能的文件,可以为它指出一些自定义属性,官方文档具体给出了如下用法:
- 告诉Git那些文件是被视作二进制文件,这些文件通常是一些无关紧要的工具配置文本文件,这些文件由于经常变动且变动信息是不需要我们关心的。告诉Git这些是二进制文件后,将不会去处理CRLF问题,也不会在使用git show 或者是 git diff命令时对这些文件进行计算或打印变化。
- 因为一些恼人的文件格式(如Word、图片),导致这些文件发生变化后,用git diff并不能恰当地显示出哪些东西变化,而这时就引入了占据大部分该文件篇幅的过滤器(或者可以说是功能扩展)。使用这些过滤器就可以让git对特定文件做出恰当预期的效果。
- 对关键词(也就是命令或者是阶段)进行扩展,比如在对一个文件进行签出或者迁入时对这个文件插入日期。
- 导出仓库时可以设置哪些文件或文件夹不会被导出(git archive),还有就是导出时对一些内容进行替换。
- 最后一个比较重要的是可以设置合并策略,比如容易起冲突的数据库配置文件,可以设置指定文件的合并策略为合并自己的,这样的话冲突了就不用手动合并了。不过需要注意的是,当文件没有发生冲突,文件会保持原有版本。
Git基本操作
官方文档:Git - Reference (git-scm.com)
*创建仓库:在任意空目录下作为本地Git仓库,打开Bash用git init完成创建,生成一个隐藏.git目录。
*文件修改状态过程图:
git add---(工作区->暂缓区) 单个文件名|通配符(.)
git commit---(暂缓区->本地仓库) -m “备注信息”
git status---查看修改文件的状态
git log[option]:
options
--all 显示所有分支
--pretty=online 将提交信息显示为一行
--abbrev-commit 使得输出的commitId更简短
--graph 以图的形式显示
git reset –hard commitID:根据git-log或git log获得id进行版本回退
git reset HEAD -- . (一次性撤销所有放入暂存区的文件)
git reset HEAD -- filename (撤销指定目标文件)
git rm --cached filename (撤销指定目标文件)
git rm -f filename (撤销并删除本地文件,回收站也消失了,慎用)
git reflog:查看已经删除(指回退版本非物理删除)的记录
*忽略不受git管理:工作目录下创建一个.gitignore的文件写文件名(支持通配符和逻辑运算符,例*.a !lib.a)。
git branch---(查看所有分支,-vv查看分支绑定关系) 分支名 (创建一个分支)
git checkout 分支名---(切换分支) -b 分支名(创建并切换分支)
git merge 分支名称---(将当前分支合并到其他分支)--no-off(禁止快照)
git branch -d 分支名---(做检查删除其他分支,不能删除当前分支)
git branch -D 分支名---(不做检查强制删除)
解决冲突:分支合并时俩分支修改了同一文件导致不合,通过手动改动后再次合并。
分支开发规范:
快进模式:当要合并的分支内容包含当前分支,即可直接将当前分支变成合并分支。
git remote add orign(非必须但规范)远程仓库ssh地址
git remote 查看所有远程仓库
git push [-f] [--set-upstream] [远端名称[本地分支名][:远端分支名]]---推送(当本地分支名和远端分支名相同时,可以只写一个)(-f表示本地与远端冲突时,强制覆盖)(--set-upstream设置绑定关系,绑定后可直接git push)
git clone 仓库路径 本地仓库名(不指定默认)---克隆(不频繁)
git fetch 远端分支名 本地名(不会进行合并,不指定远程名称和分支名就抓取所有分支)---针对新增加的更改
git pull 远端分支名 本地名(fetch+merge)
解决远程冲突:先pull修改冲突文件后再push
远程仓库
代码托管平台:GitHub、码云、GitLab。
GitHub:(https://github.com/)国外网站。
码云(Gitee):(https://gitee.com/)国内网站
GitLab:需要自己部署,企业使用。
获取SSH公钥:ssh-keygen -t rsa(不断回车,存在即覆盖),生成完毕后打开文件获取,cat ~/.ssh/id_rsa.pub,验证是否配置成功,ssh -T git@gitee.com。
这里有一个小“BUG”,创建的顺序未考虑周全。由于分别两端都创建了新库,提交了新的初始版本,这样,当前系统状态是远程端已经有了新版本,不能直接推送(push),要先拉取(pull)数据。另外,拉取合并产生“unrelated-histories”,故还不能直接拉取,要强行拉取(–allow-unrelated-histories)。
正确的创建顺序应该先在Github上创建空库,克隆到本地,在这个克隆的基础上创建分布式版本跟踪系统,把项目添加进去,创建初始版本,再推送,就不会产生一个分支两个不相关的历史了。
(摘自稀土掘金-林御风,https://juejin.cn/post/6844904094797152269)
IDEA操作Git
注意:idea中未暂存和已暂存分为一类,未跟踪为另外一类。
每切换分支前一定要进行commit!!!
可以将terminal配置成git bash。
Maven和Git区别
相同词:管理、版本、本地/远程仓库
不同:
Maven:管理项目的生命周期和依赖资源。划分一个项目的生命周期,统一项目依赖资源的管理方式,规定项目的构建方式,解决依赖资源的冲突问题,实现多平台间灵活的管理方案。本地仓库存储依赖资源,远程仓库存放公共资源,一般本地仓库资源通过坐标从远程仓库获取。
Git:提供一套代码版本管理服务,分布式地在本地拥有一套自己的代码库,也称本地仓库。规定文件的修改流程,每个提交操作拥有一个唯一版本号的机制,实现代码回溯查询功能。独特分支管理机制,分支合流、分支备份、分支修改操作具现了企业分支开发规范,并且在团队合作中,合并代码显得更加快捷和安全,本地仓库代码推送到远程代码托管平台的仓库,远程仓库也同样克隆或抓取到本地仓库,快速的实现获取其他成员的代码。
总结:Maven实现对项目的开发管理和依赖资源的版本管理,Git实现团队开发的代码修改版本更新管理,二者用途不同。