最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。
依赖是否可选
<!—主要用于排除传递性依赖–>
…
…
…
-
dependencies 可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。
-
grounpId、artifactId和version 组成了依赖的基本坐标。
-
type 指定了依赖的类型,默认为 jar。
-
scope 指定了依赖的范围(详情见下面依赖范围部分)。
-
optional 标记了依赖是否是可选的(详情见下面依赖可选部分)。
-
exclusions 用来排除传递性依赖(详情见下面依赖排除部分)。
依赖范围有以下几种:
-
compile,默认的依赖范围,表示依赖需要参与当前项目的编译,后续的测试、运行周期也参与其中,是比较强的依赖。
-
test,表示依赖仅仅参与测试相关的工作,包括测试代码的编译和运行。比较典型的如 junit。
-
runntime,表示依赖无需参与到项目的编译,不过后期的测试和运行需要其参与其中。
-
provided,表示打包的时候可以不用包进去,别的容器会提供。和 compile 相当,但是在打包阶段做了排除的动作。
-
system,从参与程度上来说,和 provided 类似,但不通过 Maven 仓库解析,可能会造成构建的不可移植,要谨慎使用。
关于传递性依赖:
比如一个account-email项目为例,account-email有一个compile范围的spring-code依赖,spring-code有一个compile范围的commons-logging依赖,那么commons-logging就会成为account-email的compile的范围依赖,commons-logging是account-email的一个传递性依赖:
有了传递性依赖机制,在使用Spring Framework的时候就不用去考虑它依赖了什么,也不用担心引入多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
关于依赖可选:
项目中A依赖B,B依赖于X和Y,如果所有这三个的范围都是compile的话,那么X和Y就是A的compile范围的传递性依赖,但是如果我想X、Y不作为A的传递性依赖,不给它用的话,可以按照下面的方式配置可选依赖:
4.0.0
com.itwanger
project-b
1.0.0
mysql
mysql-connector-java
5.1.10
true
postgresql
postgresql
8.4-701.jdbc3
true
关于依赖排除:
有时候你引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到排除依赖了,比如下图中spring-boot-starter-web自带了logback这个日志包,我想引入log4j2的,所以我先排除掉logback的依赖包,再引入想要的包就行了。
org.springframework.boot
spring-boot-starter-web
2.5.6
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
2.5.6
声明exclustion的时候只需要groupId和artifactId,不需要version元素,因为groupId和artifactId就能唯一定位某个依赖。
三、Maven 仓库
在 Maven 的术语中,仓库是一个位置(place),项目中依赖的第三方库以及插件(可统称为构件),都放在这里。所有的 Maven 项目都可以共享这个仓库,只需要根据依赖的坐标,就可以在需要的时候找到仓库中的依赖,并使用它们。
举个例子,项目中使用了分页插件的依赖:
com.github.pagehelper
pagehelper-spring-boot-starter
1.1.0
那么它对应的仓库路径是这样的:
仓库可以以下几种:
1)本地仓库
当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。
默认情况下,不管是Window还是macOS,或者是 Linux,每个用户都会在自己的用户目录下有一个路径名为 .m2/repository/
的仓库目录。
如果你想自定义本地仓库目录地址,可以编辑文件~/.m2/settings.xml
,设置localRepository元素的值为你想要的仓库地址,例如:
/path/to/local/repo
如果找不到 ~/.m2/settings.xml
的话,可以到 Maven 的安装目录(前文提到的 conf 目录)下去拷贝。
2)远程仓库
默认情况下,本地仓库是被注释掉的,也就是空的,那么就必须得给 Maven 配置一个可用的远程仓库,否则 Maven 在 build(构建)的时候就无法去下载依赖。
中央仓库就是这样一个可用的远程仓库,里面包含了这个世界上绝大多数流行的开源 Java 类库,以及源码、作者信息、许可证信息等等。
不过,默认的中央仓库访问速度比较慢,通常我们会选择使用阿里的 Maven 远程仓库。
ali-maven
http://maven.aliyun.com/nexus/content/groups/public
true
true
always
fail
-
repositories 可以包含一个或者多个repository元素,以声明一个或者多个仓库。
-
id,仓库声明的唯一id,需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库也使用了该id,就会覆盖中央仓库的配置。
-
url,指向了仓库的地址。
-
releases和snapshots,用来控制Maven对于发布版构件和快照版构件的下载权限。
-
enabled子元素为 true 时表示可以从仓库下载发布版构件和快照版构件。
-
updatePolicy 子元素用来配置Maven从远处仓库检查更新的频率。
-
默认值是daily,表示每天检查一次;
-
可选值 never 表示从不检查;
-
可选值always表示每次构建时检查更新;
-
可选值interval表示每隔X分钟检查一次更新(X为任意整数)。
-
checksumPolicy 子元素用来配置Maven检查校验的策略。在下载构件的时候,Maven会去校验,如果校验失败,
-
当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息;
-
值为fail 时,Maven遇到校验错误就让构建失败;
-
值为ignore时,Maven将完全忽略校验。
搭建远程仓库的另外一个目的是方便部署我们自己的项目构件至远程仓库供其他团队成员使用,这时候需要配置distributionManagement元素:
releases
public
http://59.50.95.66:8081/nexus/content/repositories/releases
snapshots
Snapshots
http://59.50.95.66:8081/nexus/content/repositories/snapshots
-
repository表示发布版本构件的仓库。
-
snapshotRepository 表示快照版本(开发测试用)的仓库。
-
这两个元素都需要配置id、name和url,id为远程仓库的唯一标识,name是为了方便阅读,url表示仓库的地址。
配置好了以后运行命令 mvn clean deploy
,Maven就会将项目部署到对应的远程仓库。项目是快照还是发布版本通过之前远程仓库配置项中的 releases 和 snapshots 来区分。
3)仓库镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。通常我们会在 settings.xml 文件中添加阿里云镜像:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
其中 mirrorOf 元素的可选项有:
-
*
,匹配所有远程仓库。 -
external:*
,匹配所有远程仓库,使用localhost的除外,使用file://
协议的除外。也就是说,匹配所有不在本机上的远程仓库。 -
repo1,repo2
,匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。 -
*,!repo1
,匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
上例中 <mirrorOf>central</mirrorOf>
表示任何对于中央仓库的请求都会转至该镜像。
4)私服
私服是一种特殊的远程仓库,它架设在局域网内中,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,先从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,并缓存到私服上。
私服有以下好处:
-
节省外网访问速度
-
加速Maven构建
-
提高稳定性,增强控制
-
降低中央仓库的负荷
5)仓库服务搜索
推荐 2 个提供仓库搜索服务的网站:
- Sonatype Nexus:Nexus Repository Manager
- MVNrepository:http://mvnrepository.com/
四、使用 Maven
1)Maven 常见命令
-
mvn clean
:表示运行清理操作(会默认把target文件夹中的数据清理)。 -
mvn clean compile
:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
最后
pository:http://mvnrepository.com/
四、使用 Maven
1)Maven 常见命令
-
mvn clean
:表示运行清理操作(会默认把target文件夹中的数据清理)。 -
mvn clean compile
:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
最后
[外链图片转存中…(img-FhtqNfLP-1715675318814)]
[外链图片转存中…(img-qbX9vstU-1715675318815)]