本文是自己的学习笔记,主要参考以下资料
- B站,黑马程序员制作,https://www.bilibili.com/video/BV1Ah411S7ZE?p=5
如果依赖有冲突,那实际采用的版本遵循以下原则。
如果项目A引入了一个依赖a,其他项目依赖项目A时会自动引入依赖a,如果我们不希望其他项目因为项目A引入依赖a时,我们可以在项目A引入依赖a时进行配置optional
选项,令值为true即可。
比如Project2引入了Project1,而Project1引入了log4j
依赖。我们可以看到Project2也引入了log4j
这是我们在Project1的pom文件中设置,令optional=1
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
<optional>trueoptional>
dependency>
刷新一下Maven,就可以看到Proejct2不再引入log4j
依赖了。
想要Project2不间接依赖log4j
的话,也可以主动在Project2的Pom文件中配置。使用
。这样也可以达到目的。
<dependency>
<groupId>com.mavenlearning.project1groupId>
<artifactId>Project1artifactId>
<version>1.0.0version>
<exclusions>
<exclusion>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
exclusion>
exclusions>
dependency>
依赖范围是指导入的依赖可以在项目中的哪些阶段或者位置使用,使用junit
的scope=test
,那junit
这个依赖包只能在test方法中使用。
scope | 主程序 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
其中, 打包范围是指packaging指令的范围。
标签
同级它的作用是指明项目的打包方式,一般来说有三种打包方式,分别是jar
,war
,pom
。jar
和war
就代表打包成jar包和war包。下面就详细讲一下pom
是什么。
聚合管理项目就是在Maven层面统一管理一组有依赖关系的项目。
比如现在现在有三个项目,Project2依赖Project1,Project3依赖Project2。
这三个项目有依赖关系,在开发中如果有更新,那三个项目就应该同时更新,那我们就要在三个项目中分别进行install
操作。这实在有点麻烦。这时候我们就可以利用
标签,对着三个项目聚合管理,一次install
就能将三个项目都更新到仓库。
我们可以建立一个新项目,就叫Project,这个项目是个空项目,我把src下的文件都删了,只留一个pom.xml
文件。
建立这个项目的目的是为了聚合管理剩下的三个项目。
在Project的pom.xml
文件中将
的值设为pom
。表示这个项目是个空的项目。
之后加上
标签,表示聚合管理这些项目,以后对Project进行的maven操作都会一起作用到
中定义的项目
现在我们对Project项目进行install操作,日志如下。
可以看到Project1,2,3都被一起install了。
和
类似的,他们的子标签都是
。不同的是,
是定义项目的依赖,定义好之后,项目会去加载对应的依赖。而
中是存放依赖的定义。等到需要用到依赖的时候就在
指定
和
即可。
比如下面就没有指定spring-contexg的版本,但是项目是知道要去使用5.3.15的。
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.15version>
dependency>
dependencies>
dependencyManagement>
通常来说,这个标签是用来统一管理依赖,一般在父项目中定义依赖,子项目就使用父项目中的依赖,不会导致版本号不一致的情况。
顾名思义就是定义属性的标签。
<properties>
<spring.version>1.0.0spring.version>
properties>
上面就定义了一个属性,如果想要使用它就用${spring.version}
就可。
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
我们可直接使用setting.xml
中的属性,一般用于动态配置,他们都是以settings开头。
比如${settings.localRepository}
凡是在Java程序中用System.getProperty()
方法能得到的变量,都可以在maven中直接使用。
比如${user.home}
同时,我们也可以使用maven的命令来查询哪些系统变量可使用。使用mvn help:system
即可查询
资源文件一个是指resourse下的文件。
我们在maven中定义一个变量
,jdbc.properties也能访问到这个变量。
首先是maven中属性的定义
<properties>
<jdbc.url>jdbc:mysql/localhost:3306/mavenjdbc.url>
properties>
定义好之后,还需要加上一些配置,表示允许资源文件访问maven中的变量。
指定资源文件所在目录,并且令
。
<build>
<resources>
<resource>
<directory>{project.baseurl}/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
之后再jdbc.properties````中用
${}```使用变量即可。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.user=root
jdbc.password=123456
之后我们对项目进行package操作,然后查看target中编译的配置文件。可以看到jdbc.properties成功使用了maven中定义的变量
就是用来多环境配置的,有些属性值或者其他的配置会根据环境变化,这里就需要用到这个标签。
比如上面的
标签,假设生产环境端口号是3306,开发环境是3307,那我们就可以进行下面的配置。
<profiles>
<profile>
<id>proid>
<properties>
<jdbc.url>jdbc:mysql/localhost:3306/mavenjdbc.url>
properties>
profile>
<profile>
<id>devid>
<properties>
<jdbc.url>jdbc:mysql/localhost:3307/mavenjdbc.url>
properties>
profile>
profiles>
很明显id就是唯一表示一个profile。然后我们不仅可以配置
,还可以配置其他的比如
和
。
如果我们没有设置默认profile的话,同时指定profile,那Maven完全不会去使用任何一个profile定义的内容。
我们可以通过
来指定默认profile
<activation>
<activeByDefault>trueactiveByDefault>
activation>
比如我们指定pro
为默认profile
<profiles>
<profile>
<id>proid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<jdbc.url>jdbc:mysql/localhost:3306/mavenjdbc.url>
properties>
profile>
<profile>
<id>devid>
<properties>
<jdbc.url>jdbc:mysql/localhost:3307/mavenjdbc.url>
properties>
profile>
profiles>
我们可以通过命令行指定profile。
参数是在指定后面加上-P profileId
。比如指定profile为dev
mvn package -P dev
同properties中介绍的那样,我们看看编译后的jdbc.properties文件的值的变化就能知道指定profile是否成功。
第一次是用pro,第二次用dev,结果显示指定成功
mvn package -P pro
mvn package -P dev