如果你对 Maven
的了解只停留在怎么添加依赖包,你真的需要看接下来的内容。
org.openjdk.jol
jol-core
0.10
目前 java 项目流行的项目管理工具 Maven
和 Gradle
。目前使用率来说,Maven
使用占比是高于 Gradle
的。纠结选哪个管理工具的时候就用 Maven
就行。
在 Maven
中通过 POM-Project Object Model
项目对象模型的概念来管理项目。在 Maven 中每个项目都相当于一个对象,对象(项目)之间可以依赖、继承、聚合。
项目依赖包查找网站 https://mvnrepository.com
依赖包放在 Maven
仓库中,我们需要通过依赖的坐标信息,从仓库中下载 jar 。
坐标信息:groupId,artifactId,version
当我们在 pom.xml
引入某个 a.jar
, Maven
会从本地仓库查找有没有 a.jar
,没有就会去私服下载,私服没有会从中央仓库下载到私服,然后下载本地仓库。
maven-a.jar
依赖 maven-b.jar
maven-b.jar
依赖 maven-c.jar
maven-client
项目中引入 maven-a.jar
,那么 maven-b.jar
和 maven-c.jar
都会引入进来。
有了依赖传递,但也存在一个问题。
maven-a.jar
依赖 maven-b.jar
maven-b.jar
依赖 maven-c.jar
(2.0)
maven-a.jar
依赖 maven-c.jar
(1.0)
maven-client
项目中引入 maven-a.jar
。
最终会采用哪个 maven-c.jar
所以 maven 依赖传递的其中一个规则就是,最短路径原则
。
a -> b ->c(2.0)
a -> c(1.0)
maven-client
项目最终使用 1.0 的 c 。
最短路径原则存在一个问题,当最短路径一样的时候怎么办,最先声明原则就是再最短路径相同的时候声效。
maven-client
项目中引入 maven-a.jar
和 maven-b.jar
maven-b.jar
只依赖 maven-c.jar
(2.0)
maven-a.jar
只依赖 maven-c.jar
(1.0)
现在依赖的最短路径一样
maven-client
-> maven-a
-> maven-c(1.0)
maven-client
-> maven-b
-> maven-c(2.0)
在 maven-client
先引入的 maven-a
那么 maven-c 1.0
声效
在 maven-client
先引入的 maven-b
那么 maven-c 2.0
声效
最先声明有点达不到我们的预期,我可以可以这样解决。
maven-client
引入你想要的 maven-c
的版本。
org.example
maven-a
1.0-SNAPSHOT
org.example
maven-b
1.0-SNAPSHOT
org.example
maven-c
1.0-SNAPSHOT
这样排除掉 maven-b
传递过来的 maven-c
。根据自己的需求
org.example
maven-a
1.0-SNAPSHOT
org.example
maven-b
1.0-SNAPSHOT
org.example
maven-c
依赖的作用域定义了 jar 在什么时候生效,打包成 war 或者 jar 的时候是否打包进去。
mysql
mysql-connector-java
runtime
scope
取值不同,意义不一样。
scope
默认取值 compile
标识,当前依赖包,参与项目的编译、运行、测试、打包。
runtime
标识不参与项目编译,参与项目的运行、测试、打包。
provided
标识参与项目的编译、运行、测试,但是不参与打包。
system
用于我们开发的一些二方库,但是不能发布到网上,可以使用这种场景去使用。默认这种 jar 不会打包进去,需要我们配置一下。
参与项目的编译、运行、测试。
org.example
maven-d.jar
1.0-SNAPSHOT
system
${basedir}/lib/maven-d.jar
org.springframework.boot
spring-boot-maven-plugin
${basedir}/lib
BOOT-INF/lib/
**/*.jar
test
标识只在编译测试代码和运行测试代码的时候需要,别的都不用,打包的时候也不会包含。
一般我们会在父工程使用这个作用域。表示从其它的 pom.xml 导入 dependency 的配置。
比如我们自己的父工程,只想要 springboot 的依赖管理。
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
maven-client
继承了 maven-client
maven-demo
org.example
1.0-SNAPSHOT
4.0.0
jar
maven-client
maven-demo
聚合了五个工程。
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
org.example
maven-demo
pom
1.0-SNAPSHOT
maven-a
maven-b
maven-c
maven-client
maven-d
继承用于消除冗余配置,比如一些配置打包配置,配置的变量,项目依赖和插件依赖版本管理
聚合用于快速构建项目。
聚合之前打包 a,b,c,d,clent 需要分别运行 mvn package。
聚合之后,我咱们只需要在 maven-demo 下运行 mvn package。
maven 内部有三个构建周期。clean ,default,site。
其中 default 是我们经常使用的生命周期。
只干一件事情,将编译生成的东西删除干净。
默认生命周期大致由下面几个阶段组成。
resources
-> compile
-> testResources
-> testCompile
-> test
-> package
-> install
-> deploy
介绍下我们常用的。
resources:拷贝 src/main/resources 下资源到 classpath 下。
compile:编译项目源码
testResources:拷贝 src/test/resources 到 测试的 test 的 classpath 下
test:运行单元测试
package:打包
install:安装 jar 到本地仓库
deploy: 发布 jar 到远程仓库或私有仓库
org.apache.maven.plugins
maven-assembly-plugin
${basedir}/assembly/package.xml
make-assembly
package
single
mvn clean package
限制性 clean
生命周期,再执行 default
生命周期到 package
阶段。
mirrorOf 指定代理那个仓库 settings.xml配置镜像
/Users/zhangpanqin/.m2/repository
aliyunmaven
central
中央仓库镜像
https://maven.aliyun.com/repository/public
你也可以在 pom.xml 配置私服
ali_maven
https://maven.aliyun.com/repository/central/
true
true
你也可以根据不同的配置环境,启动不同的 jdk 环境,或者根据不同的环境启动不同的镜像
settings.xml 配置。
test-1
false
public-snapshots
public-snapshots
http://mvn.uinnova.cn/nexus/content/groups/public
true
daily
warn
true
也可以针对具体的项目配置
local
local
false
dev
dev
true
prod
prod
false
test
test
false
pom.xml 配置
flyyou
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-assembly-plugin
${basedir}/assembly/package.xml
make-assembly
package
single
package.xml
${project.version}-${profileActive}-bin
tar.gz
zip
${project.build.directory}
lib
*.jar
${basedir}/bin
bin
*.sh
*.bat
${basedir}/doc
doc
pic/**
*.md
*.pdf
${project.build.outputDirectory}
conf
application-${profileActive}.yml
logback-spring.xml
application.yml
spring:
application:
name: flyyou-service
profiles:
active: @profileActive@
图形化界面切换开发环境,再也不用不停修改配置文件了
*-local.yml
在 .gitignore
忽略掉,本地开发环境各个之间互不影响。
自动构建的时候使用下面命令,打包开发环境
mvn clean package -Ddev
本文由 张攀钦的博客 http://www.mflyyou.cn/ 创作。 可自由转载、引用,但需署名作者且注明文章出处。
如转载至微信公众号,请在文末添加作者公众号二维码。微信公众号名称:Mflyyou