maven中使用坐标导入jar包时会把与之相关的依赖jar包导入(导入spring-context的jar时就会把spring的整个主体导入)
,而如果在导入两个及以上jar包坐标,而多个包会依赖同一个相关jar,而这多个jar的版本不同,就会导致jar包冲突(导入spring-context的jar时导入spring-core的jar,而导入spring-beans的jar时也会导入spring-core的jar。spring-context的jar和spring-beans的jar不同时就会发生spring-core的jar的冲突)
第一声明优先原则:哪个jar包坐标在靠上位置。这个jar就是先声明的,而先声明的jar包的依赖包会优先进入项目
maven导入jar包的一些概念;
直接依赖:项目中直接导入的jar包,就是项目的直接依赖包
传递依赖:项目中没有直接导入,而是提供项目直接依赖jar包传递到项目中的jar
解决jar冲突的方法:
路径优先原则:直接依赖路径比传递依赖路径近,那么最终进入项目的jar是直接依赖,没有直接依赖才提供传递依赖导入
直接排除法:当要排除某个jar下的依赖包时,配置exclusions标签,标签内部可以不写版本号。此时版本号默认和本jar包的一样。
<modelVersion>4.0.0modelVersion>
<groupId>com.company.projectgroupId>
<artifactId>moduleartifactId>
<packaging>warpackaging>
<version>0.0.1-SNAPSHOTversion>
<name>test Maven Webappname>
<url>http://maven.apache.orgurl>
modelVersion:pom文件的模型版本
group id和artifact id,为了便于多人多模块协同开发管理,建议使用以下命名规范
group id:com.公司名.项目名
artifact id:功能模块名
packaging:项目打包的后缀,war是web项目发布用的,默认为jar
version: artifact模块的版本
name和url:相当于项目描述,可删除
group id + artifact id +version :项目在仓库中的坐标
<properties>
<spring.version>5.1.6.RELEASEspring.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>${spring.version}version>
dependency>
dependencies>
这是创建项目时自动生成的,将jar引入到项目中。
properties:统一管理jar包版本,配置完成若要修改jar包的版本,只需修改对应properties中的版本号即可
dependencyManagement:锁定jar包版本,被锁定的jar包版本是多少,导入项目时就是多少不会产生版本冲突问题(jar包冲突)。注意:在dependencyManagement配置后还要再dependencys中配置,dependencyManagement只锁定jar,不负责导入
dependency:引入资源jar包到本地仓库,要引入更多资源就在dependencies标签中继续增加dependency标签
group id+artifact id+version:资源jar包在仓库中的坐标
scope:作用范围,test指该jar包仅在maven测试时使用,发布时会忽略这个包。需要发布的jar包可以忽略这一配置
<build>
<finalName>testfinalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version >
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<path>/path>
<port>8080port>
configuration>
plugin>
plugins>
build>
build:项目构建时的配置
finalName:在浏览器中的访问路径,如果将它改成helloworld,再执行maven–update,这时运行项目的访问路径是 http://localhost:8080/helloworld/ 而不是项目名的 http://localhost:8080/test
plugins:插件,第一个插件是用来设置java版本为1.8,第二个插件是用来设置编码为utf-8
group id+artifact id+version:插件在仓库中的坐标
configuration:设置插件的参数值