背景
今日查看项目的maven依赖,看到<properties>和<dependency>的内容,感觉很奇怪,好像都指定了配置依赖的信息,但是他们俩的区别作用,还真不知道,所有我来研究了下。
区别
<dependency> 标签用于声明项目的依赖库,定义需要导入的外部依赖库、版本号、包名称等信息,使得项目能够正确编译和运行。而 <properties> 标签则用于定义项目中需要使用的变量(属性),这些变量可以在 POM.xml 文件的其他地方引用,方便统一管理和维护项目中的属性。因此,两者的作用不同,使用场景也不同。
在使用 <dependency> 标签时,我们通常需要指定依赖库的版本号、名称等属性,这些信息可以通过 <properties> 标签定义,然后在 <dependency> 标签中使用 ${propertyName} 形式引用来统一管理和维护。这样可以防止因版本号不一致或者名称不匹配导致的依赖库冲突或者无法加载的问题。
说的可能抽象了,简单来说<properties> 可以指定导入包的版本等信息, <dependency>直接用它的内容。<properties>类似于Java 你定义了一个变量 String version = xxxx, 后面实际调用的时候就使用version代替。
例子
<properties> 标签用于定义 POM.xml 文件中使用的属性,例如:
<project>
<groupId>com.mycompany.app</groupId>
<artifactId>my-project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<junit.version>5.7.2</junit.version>
<log4j.version>2.15.0</log4j.version>
<my.constant>123</my.constant>
<my.path>/my/project/path</my.path>
</properties>
...
</project>
在这个例子中,使用 <properties> 标签定义了四个属性,分别是 junit.version、log4j.version、my.constant 和 my.path。其作用分别如下:
- junit.version:定义了 Junit 的版本号,方便在
<dependency>标签中引用; - log4j.version:定义了 Log4j 的版本号,方便在
<dependency>标签中引用; - my.constant:定义了一个常量属性,可以在 POM.xml 文件中的任何位置引用;
- my.path:定义了一个路径属性,可以在 POM.xml 文件中的任何位置引用。
<dependency> 标签是用于声明项目的依赖库的,例如:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
在这个例子中,使用 <dependency> 标签声明了两个依赖库,分别是 Junit 和 Log4j。其中,{log4j.version} 分别引用了 <properties> 标签中定义的变量,方便统一管理和维护依赖库的版本号。此外,在第一个 <dependency> 标签中,使用了 scope 属性来指定依赖库的作用范围为测试时使用。
总结
比对了下公司项目,在<properties>中指定依赖版本,<dependency>中直接调用版本信息