Java开发工具篇
Maven
每一个 Maven 工程都有一个 pom.xml 文件,位于根目录中,包含项目构建生命周期的详细信息。通过 pom.xml 文件,我们可以定义项目的坐标、项目依赖、项目信息、插件信息等等配置。
对于开发者来说,Maven 的主要作用主要有 3 个:
- 项目构建:提供标准的、跨平台的自动化项目构建方式。
- 依赖管理:方便快捷的管理项目依赖的资源(jar 包),避免资源间的版本冲突问题。
- 统一开发结构:提供标准的、统一的项目结构。
Maven 项目生命周期与构建原理及相关命令?
Maven从项目的三个不同的角度,定义了单套生命周期,三套生命周期是相互独立的,它们之间不会相互影响。
- 默认构建生命周期(Default Lifeclyle): 该生命周期表示这项目的构建过程,定义了一个项目的构建要经过的不同的阶段。
- 清理生命周期(Clean Lifecycle): 该生命周期负责清理项目中的多余信息,保持项目资源和代码的整洁性。一般拿来清空directory(即一般的target)目录下的文件。
- 站点管理生命周期(Site Lifecycle) :向我们创建一个项目时,我们有时候需要提供一个站点,来介绍这个项目的信息,如项目介绍,项目进度状态、项目组成成员,版本控制信息,项目javadoc索引信息等等。站点管理生命周期定义了站点管理过程的各个阶段。
- Maven构建命令使用mvn开头,后面添加功能参数,可是一次执行多个命令,使用空格分隔
- 当然,需要注意的是,当你在命令行窗口中使用mvn命令时,必须进入到pom文件的上一级目录中
- mvn compile #编译
- mvn clean #清理
- mvn test #测试
- mvn package #打包
- mvn install #安装到本地仓库
maven基础概念
项目中依赖的第三方库以及插件可统称为构件。每一个构件都可以使用 Maven 坐标唯一标识,坐标元素包括:
- groupId(必须): 定义了当前 Maven 项目隶属的组织或公司。groupId 一般分为多段,通常情况下,第一段为域,第二段为公司名称。域又分为 org、com、cn 等,其中 org 为非营利组织,com 为商业组织,cn 表示中国。以 apache 开源社区的 tomcat 项目为例,这个项目的 groupId 是 org.apache,它的域是 org(因为 tomcat 是非营利项目),公司名称是 apache,artifactId 是 tomcat。
- artifactId(必须):定义了当前 Maven 项目的名称,项目的唯一的标识符,对应项目根目录的名称。
- version(必须):定义了 Maven 项目当前所处版本。
- packaging(可选):定义了 Maven 项目的打包方式(比如 jar,war…),默认使用 jar
- classifier(可选):常用于区分从同一 POM 构建的具有不同内容的构件,可以是任意的字符串,附加在版本号之后。只要你提供正确的坐标,就能从 Maven 仓库中找到相应的构件供我们使用。
仓库:用于存储资源,包含各种jar包。仓库分为本地仓库和远程仓库
坐标:使用唯一的标识,通过改标识可以下载对应的资源
Pom.xml
<project>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclusion>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
- dependencies:一个 pom.xml 文件中只能存在一个这样的标签,是用来管理依赖的总标签。
- dependency:包含在 dependencies 标签中,可以有多个,每一个表示项目的一个依赖。
- type(可选):依赖的类型,对应于项目坐标定义的
- packaging。大部分情况下,该元素不必声明,其默认值是 jar。
- optional(可选):标记依赖是否可选
- exclusions(可选):用来排除传递性依赖,例如 jar 包冲突
- scope(可选):依赖的范围,默认值是 compile。
依赖范围
- compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种都有效,即在编译、测试和运行的时候都要使用该依赖 Jar 包。
- test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试,而在编译和运行项目时无法使用此类依赖,典型的是 JUnit,它只用于编译测试代码和运行测试代码的时候才需要。
- provided:此依赖范围,对于编译和测试有效,而对运行时无效。比如 servlet-api.jar 在 Tomcat 中已经提供了,我们只需要的是编译期提供而已。
- runtime:运行时依赖范围,对于测试和运行有效,但是在编译主代码时无效,典型的就是 JDBC 驱动实现。
- system:系统依赖范围,使用 system 范围的依赖时必须通过 systemPath 元素显示地指定依赖文件的路径,不依赖 Maven 仓库解析,所以可能会造成建构的不可移植。
Maven中包的依赖原则?如何解决冲突?
依赖原则?
- 依赖路径最短优先原则
A -> B -> C -> X(1.0)
A -> D -> X(2.0)
由于 X(2.0) 路径最短,所以使用 X(2.0)。
- 声明顺序优先原则
A -> B -> X(1.0)
A -> C -> X(2.0)
在 POM 中最先声明的优先,上面的两个依赖如果先声明 B,那么最后使用 X(1.0)。
- 覆写优先原则
-子 POM 内声明的依赖优先于父 POM 中声明的依赖。
如何解决冲突?
-
找到 Maven 加载的 Jar 包版本,使用 mvn dependency:tree 查看依赖树,根据依赖原则来调整依赖在 POM 文件的声明顺序。
-
发现了冲突的包之后,剩下的就是选择一个合适版本的包留下,如果是传递依赖的包正确,那么把显示依赖的包exclude掉。如果是某一个传递依赖的包有问题,那么我们需要手动把这个传递依赖execlude掉
排除依赖
<exclusions>
<exclusion>主动断开依赖引用</exclusion>
</exclusions>
可选依赖
<optional>true隐藏该依赖的引用</optional>
聚合
分模块开发与设计,将一个项目分成多个maven项目模块,由主模块统一管理
- 作用:聚合用于快速构建maven项目工程,一次性管理多个模块。
- 方法:新建一个maven模块,只留下pom文件,在pom文件里面将其打包类型设置为pom。
- 如何由主模块去管理其他所有模块:
- 注意:参与聚合操作的模块最终执行的先后顺序与模块间的依赖关系有关,与配置顺序无关
<!-- 定义该工程用于进行构建管理 -->
<packaging>pom</packaging>
<!-- 管理工程模块列表 -->
<module>模块名(地址)</module>
<!-- 具体工程模块名称 -->
<module>模块名(地址)</module>
<module>模块名(地址)</module>
</modules>
继承
通过继承可以是在在子模块(工程)中使用父模块中的依赖配置(与Java继承类似)
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
//前面三个与父模块中的坐标相同
<relativePath>父模块的pom文件的地址</relativePath>
</parent>
** <relativePath>** 的作用是为了找到父级工程的pom.xml;默认值是../pom.xml。
Maven首先在构建当前项目的地方寻找父项 目的pom,
其次在文件系统的这个位置(relativePath位置),
然后在本地仓库,最后在远程仓库寻找父项目的pom。
属性
1、自定义属性:
作用:等同于Java中的变量,方便统一管理重复代码(例如:多个依赖的版本号一致时,当需要全部改变时则只需要修改变量)
<properties>
<spring.version> 5.1.9.RELEASE</spring.version>
</properties>
调用格式:${变量名}
2、内置属性:
作用:使用maven的内置属性,快速配置
调用格式:${version} ${basedir}等
3、Setting属性:
作用:使用maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:${settings.localRepository}
4、Java系统属性:
作用:读取Java系统属性
调用格式:${user.home}
5、环境变量属性:
作用:读取环境变量属性
调用格式:${env.JAVA_HOME}
资源配置:
配置资源文件:
<!--配置资源文件对应的信息-->
<resources>
<resource>
<!--设定配置文件对应的位置目录,支持使用属性动态设定路径-->
<directory>地址</directory>
<!--开启对配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
指定 Maven 编译器插件
默认情况下,Maven 使用 Java5 编译我们的项目。要使用不同的 JDK 版本,请在 pom.xml 文件中配置 Maven 编译器插件。例如,如果你想要使用 Java8 来编译你的项目,你可以在标签下添加以下的代码片段:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
这样,Maven 就会使用 Java8 的编译器来编译你的项目。如果你想要使用其他版本的 JDK,你只需要修改和标签的值即可。例如,如果你想要使用 Java11,你可以将它们的值改为 11。
多环境开发配置
Maven 配置文件允许我们配置不同环境的构建设置,例如开发、测试和生产。在 pom.xml 文件中定义配置文件并使用命令行参数激活它们:
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>dev</environment>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
执行命令:mvn clean install -P production
跳过测试的三种方式
当你不得不进行测试时,但部分模块仍未开发完毕:此时不得不选择跳过测试
或者:
执行命令:mvn install/package -D skipTests
当然你也可以:
配置maven私服nexus
1.本地开发机器上安装nexus
本地搭建了一个nexus私服,即可以使用公司nexus私服仓库中的依赖,也可以上传和使用自己的测试包依赖。
nexus下载地址:
2.搭建私服作用:
原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。还有就是公司有自己的jar可以发布到私服上等等。
此文章测试搭建的是本地开发机器上安装nexus,无论是本地还是公司私服的搭建,都是一样的。
![在a](https://img-blog.csdnimg.cn/9633a92a31fc42c294854b63ad057b25.png)
本地访问私服:
在本地仓库中配置访问服务器权限,用户名,密码
配置镜像:
注意:
本地仓库的setting需和本机安装的maven里面的setting内容保持一致
IDEA访问私服和组件上传
在pom中编写“发布配置管理”
执行命令:
mvn deploy
Git
git 常用命令
#! /bin/bash命令修改文件
查看所有的远程仓关联情况
创建远程仓库及别名
git remote -v
>>
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
要使用Git连接到远程仓库,可以按照以下步骤进行操作:
首先,在本地创建一个新的文件夹来存放项目。打开命令行工具(如Terminal或Command Prompt)并导航到该文件夹所在位置。
初始化Git仓库。运行以下命令将当前文件夹转换为Git仓库:git init
添加远程仓库URL。通过运行以下命令将远程仓库与本地仓库关联起来:git remote add origin <remote_repository_url>,其中 <remote_repository_url> 是远程仓库的URL。
确认已成功连接到远程仓库。运行 git remote -v 命令查看已经配置好的远程仓库列表。
现在就可以使用常规的Git命令对远程仓库进行操作了,比如拉取最新更改、提交修改等。
注意事项:
需要安装并正确设置Git才能完成上述操作。
若要克隆现有的远程仓库而不是直接连接到现有的仓库,则应使用 git clone <remote_repository_url> 命令。
Git中5个区,和具体操作?
- 代码提交和同步代码
- 代码撤销和撤销同步
平时是怎么提交代码的?
注意
git创建分支提示fatal: not a valid object name: ‘master‘
- 先使用git status可以发现提示我们还未进行过commit提交,根据提示可以解决该问题:
执行完git init后,创建一个新文件,然后执行git add .命令,然后执行一遍git commit -m ""命令,此时masterd分支被成功创建,此时再使用git branch创建新的分支即可。- 在本地使用 git init初始化一个空的git项目后,想使用git branch创建分支时,提示fatal: not a valid object name: ‘master’。
这个错误通常表示未找到名为 “master” 的有效提交对象,因为当前仓库还没有进行过任何提交。
在初始化一个全新的本地仓库后,首先需要通过执行至少一次提交来创建初始的提交对象,然后才能创建新的分支
- 第零步: 工作区与仓库保持一致
使用git checkout -b <new-branch-name>命令创建一个新分支并切换到它。例如:- 创建&查看&切换分支
git branch +branch_name
git branch -v
git checkout +branch_name
- 第一步: 文件增删改,变为已修改状态
- 第二步: git add ,变为已暂存状态
git status
git add --all # 当前项目下的所有更改
git add . # 当前目录下的所有更改
git add xx/xx.py xx/xx2.py # 添加某几个文件
- 第三步: git commit,变为已提交状态
git commit -m "<这里写commit的描述>"
- 第四步: git push,变为已推送状态
git push -u origin master # 第一次需要关联上
git push # 之后再推送就不用指明应该推送的远程分支了
git branch # 可以查看本地仓库的分支
git branch -a # 可以查看本地仓库和本地远程仓库(远程仓库的本地镜像)的所有分支
在某个分支下,我最常用的操作如下
git status
git add -a
git status
git commit -m 'message'
git pull --rebase
git push origin xxbranch
合并分支
注意分支前需要回到master主分支
git merge +branch_name
合并冲突
发生合并冲突时,两个分支在同一个文件的同一个位置有两套完全不同的修改,Git 无法替我们决定使用哪一个,必须人为决定使用的的更新的版本代码内容。
查看所有远程仓库及其URL
这将列出所有远程仓库及其对应的fetch和push的URL。通常origin是默认的远程仓库名称,用于你克隆的远程仓库。
git remote -v
Docker
- Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到安装了任何 Linux 发行版本的机器上。
- Docker是直接运行在宿主操作系统之上的一个容器,每个容器会有自己的权限管理,同一台宿主机上可以友好的共存多个容器。Docker借助Linux的内核特性,如:控制组(Control Group)、命名空间(Namespace)等,并直接调用操作系统的系统调用接口。
Docker和虚拟机的区别?
Docker容器复杂度更低、启动更快、资源占用更小。
Docker基础概念
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 客户端(Client) : Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。
Docker 主机(Host) :一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker 包括三个基本概念:
- 镜像(Image):就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
Docker常见镜像相关操作?
# 查找镜像
docker search mysql
# 拉取镜像
docker pull mysql
# 删除镜像
docker rmi hello-world
# 更新镜像
docker commit -m="update test" -a="pdai" 0a1556ca3c27 pdai/ubuntu:v1.0.1
# 生成镜像
docker build -t pdai/ubuntu:v2.0.1 .
# 镜像标签
docker tag a733d5a264b5 pdai/ubuntu:v3.0.1
# 镜像导出
docker save > pdai-ubuntu-v2.0.2.tar 57544a04cd1a
# 镜像导入
docker load < pdai-ubuntu-v2.0.2.tar
Docker常见容器相关操作?
# docker 开机自启
systemctl enable docker
# 容器查看
docker ps -a
# 容器启动
docker run -it pdai/ubuntu:v2.0.1 /bin/bash
# 容器停止
docker stop f5332ebce695
# 容器再启动
docker start f5332ebce695
# 容器重启
docker restart f5332ebce695
# 容器导出
docker export f5332ebce695 > ubuntu-pdai-v2.tar
# 容器导入
docker import ubuntu-pdai-v2.tar pdai/ubuntu:v2.0.2
# 容器强制停止并删除
docker rm -f f5332ebce695
# 容器清理
docker container prune
# 容器别名操作
docker run -itd --name pdai-ubuntu-202 pdai/ubuntu:v2.0.2 /bin/bash
# 实例 rabbitmq
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management
# 实例 rabbitmq 设置为docker重启后自动运行
docker update rabbitmq --restart=always
卸载docker
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装Docker -CE
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum -y install docker-ce docker-ce-cli containerd.io
配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ke9h1pt4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
查看Docker容器的日志?
#例:实时查看docker容器名为user-uat的最后10行日志
docker logs -f -t --tail 10 user-uat
#例:查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2018-02-08" --tail=100 user-uat
#例:查看最近30分钟的日志:
docker logs --since 30m user-uat
#例:查看某时间之后的日志:
docker logs -t --since="2018-02-08T13:23:37" user-uat
#例:查看某时间段日志:
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" user-uat
#例:将错误日志写入文件:
docker logs -f -t --since="2018-02-18" user-uat | grep error >> logs_error.txt
启动Docker容器?
docker run -itd pdai/ubuntu:v2.0.1 /bin/bash
- -it 可以连写的,表示 -i -t
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互
- -d: 后台模式
进入Docker后台模式
第一种:docker attach containerId
使用docker attach进入后,exit便容器也停止了。
第二种:docker exec
docker exec -it f5332ebce695 /bin/bash
推荐使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。