Maven学习笔记:pom文件配置信息详解

本文是自己的学习笔记,主要参考以下资料

- B站,黑马程序员制作,https://www.bilibili.com/video/BV1Ah411S7ZE?p=5


1、Dependency

1.1、依赖冲突

如果依赖有冲突,那实际采用的版本遵循以下原则。

  1. 最短路径优先
  2. 声明优先

1.2、屏蔽依赖

如果项目A引入了一个依赖a,其他项目依赖项目A时会自动引入依赖a,如果我们不希望其他项目因为项目A引入依赖a时,我们可以在项目A引入依赖a时进行配置optional选项,令值为true即可。

比如Project2引入了Project1,而Project1引入了log4j依赖。我们可以看到Project2也引入了log4j
请添加图片描述

这是我们在Project1的pom文件中设置,令optional=1

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    <optional>true</optional>
</dependency>

刷新一下Maven,就可以看到Proejct2不再引入log4j依赖了。
请添加图片描述

1.3、排除依赖

想要Project2不间接依赖log4j的话,也可以主动在Project2的Pom文件中配置。使用<exclusions>。这样也可以达到目的。

<dependency>
    <groupId>com.mavenlearning.project1</groupId>
    <artifactId>Project1</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>



1.4、依赖范围

依赖范围是指导入的依赖可以在项目中的哪些阶段或者位置使用,使用<scope来定义。比如引入一个依赖junitscope=test,那junit这个依赖包只能在test方法中使用。

1.4.1、scope的值

scope主程序测试代码打包范例
compile(默认)YYYlog4j
testYjunit
providedYYservlet-api
runtimeYjdbc

其中, 打包范围是指packaging指令的范围。




2、packaging标签

<packaging>标签<dependency>同级它的作用是指明项目的打包方式,一般来说有三种打包方式,分别是jarwarpomjarwar就代表打包成jar包和war包。下面就详细讲一下pom是什么。

2.1、什么是聚合管理项目

聚合管理项目就是在Maven层面统一管理一组有依赖关系的项目。

比如现在现在有三个项目,Project2依赖Project1,Project3依赖Project2。

依赖
依赖
Project3
Project2
Project1

请添加图片描述
这三个项目有依赖关系,在开发中如果有更新,那三个项目就应该同时更新,那我们就要在三个项目中分别进行install操作。这实在有点麻烦。这时候我们就可以利用<packaging>标签,对着三个项目聚合管理,一次install就能将三个项目都更新到仓库。


2.2、聚合管理项目实例

我们可以建立一个新项目,就叫Project,这个项目是个空项目,我把src下的文件都删了,只留一个pom.xml文件。
请添加图片描述
建立这个项目的目的是为了聚合管理剩下的三个项目。

在Project的pom.xml文件中将<packaging>的值设为pom。表示这个项目是个空的项目。

之后加上<modules>标签,表示聚合管理这些项目,以后对Project进行的maven操作都会一起作用到<modules>中定义的项目
请添加图片描述
现在我们对Project项目进行install操作,日志如下。
请添加图片描述
可以看到Project1,2,3都被一起install了。



3、dependencyManagement标签

<dependencyManagement><dependencies>类似的,他们的子标签都是<dependency>。不同的是,<dependencies>是定义项目的依赖,定义好之后,项目会去加载对应的依赖。而<dependencyManagement>中是存放依赖的定义。等到需要用到依赖的时候就在<dependencies>指定<actifactId><groupId>即可。

比如下面就没有指定spring-contexg的版本,但是项目是知道要去使用5.3.15的。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.15</version>
        </dependency>
    </dependencies>
</dependencyManagement>

通常来说,这个标签是用来统一管理依赖,一般在父项目中定义依赖,子项目就使用父项目中的依赖,不会导致版本号不一致的情况。




4、property标签

顾名思义就是定义属性的标签。

<properties>
	<spring.version>1.0.0</spring.version>
</properties>

上面就定义了一个属性,如果想要使用它就用${spring.version}就可。

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>${spring.version}</version>
 </dependency>
 

4.1、访问setting.xml中的属性

我们可直接使用setting.xml中的属性,一般用于动态配置,他们都是以settings开头。

比如${settings.localRepository}


4.2、访问系统中的变量

凡是在Java程序中用System.getProperty()方法能得到的变量,都可以在maven中直接使用。

比如${user.home}

同时,我们也可以使用maven的命令来查询哪些系统变量可使用。使用mvn help:system即可查询
在这里插入图片描述

4.3、资源文件访问Maven定义的变量

资源文件一个是指resourse下的文件。
请添加图片描述
我们在maven中定义一个变量<jdbc.url>jdbc:mysql/localhost:3306/maven</jdbc.url>,jdbc.properties也能访问到这个变量。


4.3.1、maven中定义属性

首先是maven中属性的定义

<properties>
    <jdbc.url>jdbc:mysql/localhost:3306/maven</jdbc.url>
</properties>


4.3.2、允许资源文件访问maven

定义好之后,还需要加上一些配置,表示允许资源文件访问maven中的变量。

指定资源文件所在目录,并且令<filtering>true</filtering>

<build>
    <resources>
        <resource>
            <directory>{project.baseurl}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>


4.3.3、使用maven中的变量

之后再jdbc.properties````中用${}```使用变量即可。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.user=root
jdbc.password=123456

4.3.4、验证

之后我们对项目进行package操作,然后查看target中编译的配置文件。可以看到jdbc.properties成功使用了maven中定义的变量

请添加图片描述



5、profiles标签

5.1、配置profile

<profiles>就是用来多环境配置的,有些属性值或者其他的配置会根据环境变化,这里就需要用到这个标签。

比如上面的<jdbc.url>标签,假设生产环境端口号是3306,开发环境是3307,那我们就可以进行下面的配置。

<profiles>
    <profile>
        <id>pro</id>
        <properties>
            <jdbc.url>jdbc:mysql/localhost:3306/maven</jdbc.url>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <properties>
            <jdbc.url>jdbc:mysql/localhost:3307/maven</jdbc.url>
        </properties>
    </profile>
</profiles>

很明显id就是唯一表示一个profile。然后我们不仅可以配置<properties>,还可以配置其他的比如<dependencies><plugins>


5.2、指定profile

如果我们没有设置默认profile的话,同时指定profile,那Maven完全不会去使用任何一个profile定义的内容。

5.2.1、设置默认profile

我们可以通过<activation>来指定默认profile

<activation>
    <activeByDefault>true</activeByDefault>
</activation>

比如我们指定pro为默认profile

<profiles>
    <profile>
        <id>pro</id>
       	<activation>
	    	<activeByDefault>true</activeByDefault>
		</activation>
        <properties>
            <jdbc.url>jdbc:mysql/localhost:3306/maven</jdbc.url>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <properties>
            <jdbc.url>jdbc:mysql/localhost:3307/maven</jdbc.url>
        </properties>
    </profile>
</profiles>


5.2.2、通过命令行参数指定profile

我们可以通过命令行指定profile。

参数是在指定后面加上-P profileId。比如指定profile为dev

mvn package -P dev

在idea中配置也有同样的效果
请添加图片描述


5.2.3、验证

同properties中介绍的那样,我们看看编译后的jdbc.properties文件的值的变化就能知道指定profile是否成功。

第一次是用pro,第二次用dev,结果显示指定成功

mvn package -P pro
mvn package -P dev

请添加图片描述请添加图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值