maven依赖管理

之前遇到一个maven依赖冲突,仲裁之后取到错误的包的问题,这里学习下相关的知识。

maven依赖基础

一个简单的依赖

<dependency>
<groupId>com.alibaba.share</groupId>
<artifactId>test</artifactId>
<version>1.4</version>
</dependency>

依赖库命名规则:
${groupId.part1}/${groupId.part2}/${version}
例:com/alibaba/share/1.4

依赖库文件命名规则:
${artifactId}-${version}-${classifier}.${type}
例:test-1.4-source.jar

注:classfier即分类器,多数的时候是用不到的,不过有写情况需要,例:
TestNG强制需要你提供分类器,以区别jdk14和jdk15
<dependency>  
   <groupId>org.testng</groupId>  
   <artifactId>testng</artifactId>  
   <version>5.7</version>  
   <classifier>jdk15</classifier>  
</dependency>

maven依赖范围

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
 </dependency>

上面的scope即约定依赖范围。

  • compile:默认值,一直可用,最后会被打包
  • provided:编译期间可用,不会被传递依赖,不会被打包。例:依赖于web容器中的提供的一个jar包,在编译的时候需要加入依赖(web容器还没有介入),运行的时候由web容器来提供。
  • test:执行单元测试时可用,不会被打包,不会被传递依赖
  • runtime:运行和测试时需要,但编译时不需要
  • system:不推荐使用

maven依赖管理

避免不同子模块中依赖版本冲突

在主pom中配置依赖

<dependencyManagement>  
    <dependencies>  
     <dependency>  
       <groupId>mysql</groupId>  
       <artifactId>mysql-connector-java</artifactId>  
      <version>5.1.2</version>  
     </dependency>  
      ...  
   <dependencies>  
</dependencyManagement>

在子pom中添加依赖

<dependencies>  
   <dependency>  
    <groupId>mysql</groupId>  
    <artifactId>mysql-connector-java</artifactId>  
   </dependency>  
</dependencies>

dependencyManagement实际上不会真正引入任何依赖,在子pom中添加之后才会。在父pom中配置了之后,子模块只需使用简单groupId和artifactId就能自动继承相应的父模块依赖配置。如果子pom中定义了version,则覆盖management中的。

可选依赖

添加不可传递的依赖:
在一个项目中加入依赖:

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>1.5</version>
      <optional>true</optional>
    </dependency>

在另一个项目依赖于上一个项目,但是如果需要用到mysql的依赖,仍然需要去添加。

依赖版本界限

要求的依赖版本>=3.8且<4.0

<version>[3.8,4.0)</version>

要求的依赖版本<=3.8.1

<version>[,3.8.1]</version>

要求必须是3.8.1版本,如果不是的话会构建失败,提示版本冲突。原来的写法<version>3.8.1</version>的意思是所有版本都可以,但最好是3.8.1

<version>[3.8.1]</version>

排除依赖

依赖project-a但是排除掉对project-a中引入的project-b的依赖

<dependency>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>project-a</artifactId>
  <version>1.0</version>
  <exclusions>
    <exclusion>
      <groupId>org.sonatype.mavenbook</groupId>
      <artifactId>project-b</artifactId>
    </exclusion>
  </exclusions>
</dependency>

替换依赖

直接使用上一步中的排除掉,然后添加要替换进来的依赖就可以了,没有什么特殊的标志来标志这个是替换进来的。

版本冲突仲裁

版本仲裁规则(在maven 2.2.1版本上测试验证)
• 按照项目总POM的DependencyManager版本声明进行仲裁(覆盖),但无警告。
• 如无仲裁声明,则按照依赖最短路径确定版本。
• 若相同路径,有严格区间限定的版本优先。
• 若相同路径,无版本区间,则按照先入为主原则。

你可能感兴趣的:(jdk,maven,Web,测试,单元测试,dependencies)