【maven】依赖中名词解释及使用方式

写在前面:pom.xml是maven依赖配置选项的地方。

1、概念介绍 

一、Dependencies:是可选依赖(Optional Dependencies) 

二、Exclusions:是依赖排除(Dependency Exclusions) 

三、dependencyManagement :统一多模块的依赖版本

每个依赖节点<dependency>都由三个子节点组成:

  • <groupId> : 该依赖库所属的组织名称
  • <artifactId> : 依赖的库名
  • <version> : 依赖的库版本

在POM 4中,<dependency> 中还引入了<scope> ,它主要管理依赖的部署。目前<scope> 可以使用5个值:

  • compile,缺省值,适用于所有阶段,会随着项目一起发布。
  • provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
  • runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
  • test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  • system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

 

2.使用方式及为什么这么用

一、Dependencies :
(1)当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。 

(2)配置可选依赖的原因: 
1)节约磁盘、内存等空间; 
2)避免license许可问题; 
3)避免类路径问题,等等。 
(3)示例:

<project>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional> <!-- value will be true or false only -->
    </dependency>
  </dependencies>
</project>

假设以上配置是项目A的配置,即:Project-A –> Project-B。在编译项目A时,是可以正常通过的。如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。假设A->B, B->x(可选), B->y(可选)。这里由于x,y是可选依赖,依赖不会传递,x,y将不会对a有任何影响。

总结一句话:依赖不具有传递性,新项目使用某依赖时,需要重新引入。

二、Exclusions 
(1)当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。 
(2)示例(假设配置的是A的pom.xml,依赖关系为:A –> B; B –> C):

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectC</groupId>
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

相对于dependencyManagement,父类中直接使用所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。

如果依赖只在某个子项目中使用,则可以在子项目的pom.xml中直接引入,防止父pom的过于臃肿。

三、dependencyManagement

(1)为什么要用dependencyManagement?

如果你的项目有多个子模块,而且每个模块都需要引入依赖,但为了项目的正确运行,必须让所有的子项目(以下子项目即指子模块)使用依赖项的统一版本,才能保证测试的和发布的是相同的结果。那么如何保证模块之间的版本是一致的呢?

Maven 使用 dependencyManagement 来统一模块见的依赖版本问题。

在父项目的POM文件中,我们会使用到dependencyManagement元素。通过它来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在dependencyManagement元素中指定的版本号。
 

()示例

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.XXXX</groupId>
                <artifactId>inf-B</artifactId>
                <version>1.2.10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

dependencies与dependencyManagement 区别总结:

1、dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

2、dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

依赖的版本不能统一时,依赖传递的原则:
1、在工程的依赖树上,深度越浅,越被有限选择。

2、若两个依赖包处于依赖树上的同一层,则谁在前选择谁。
 

其他:

1.maven的依赖调解有两大原则:路径最近者优先;第一声明者优先。 

2.maven的归类依赖,在pom文件中,我们经常会看到:

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>${scala.version}</version>
</dependency>

里面的${scala.version}是由下面语句统一配置:定义如下属性值后,maven会将pom中的所有的${scala.version}替换成实际值2.3.0

<properties>
<scala.version>2.3.0<scala.version>
</properties>

3.在修改完pom文件后,会重新加入依赖,对于一些需要提交的到机器上的作业而言,需要将其进行打包,即package,否则提交的作业还是依赖原来的包。比如在美团,有一个hadoop的中转站工具,名曰hope,在提交任务的时候,如果修改pom,则需要先进行hope package demo.hope然后再提交。

 

参考:

1.https://blog.csdn.net/eff666/article/details/51991465

2.https://blog.csdn.net/OiteBody/article/details/70882940

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java项目,jar包是一种常见的依赖方式,而Maven则是一种更加高级的依赖管理工具。二者的不同主要在以下几个方面: 1. 依赖管理方式不同:使用jar包方式,需要手动下载所需的jar包,并将其添加到项目;而使用Maven则可以在pom.xml文件声明依赖Maven会自动下载所需的jar包,并且可以管理依赖的版本、作用域等信息。 2. 依赖继承方式不同:使用jar包方式,如果一个项目依赖于多个jar包,需要手动处理这些jar包之间的依赖关系;而使用Maven则可以通过父子模块的继承关系,让子模块自动继承父模块的依赖,避免了手动处理依赖关系的繁琐工作。 3. Maven提供了更多的功能:Maven不仅提供了依赖管理的功能,还可以进行构建、测试、打包、发布等操作,可以帮助开发人员更加高效地管理项目。 总之,使用Maven能够更加方便地管理项目的依赖,避免了手动下载和处理依赖关系的繁琐工作。但是,如果只是一个简单的项目,使用jar包方式也是可以的。 ### 回答2: jar包方式Maven依赖方式是Java两种不同的方式来引入和管理外部依赖。 首先,使用jar包方式,我们需要手动将外部依赖的jar包下载并保存在本地,然后将这些jar包添加到项目的classpath。这种方式需要我们手动管理所有的依赖,包括版本控制和冲突解决,容易出现依赖冲突的问题。 而Maven依赖方式则通过在项目的pom.xml文件声明所需的依赖Maven会自动从网络上下载这些依赖并保存在本地的仓库Maven还会根据依赖关系自动解决依赖冲突,并确保每个依赖库的正确版本。这种方式简化了依赖管理的过程,提供了更简单和可重复使用的项目构建和部署。 其次,使用jar包方式,我们需要手动下载和添加所有的依赖,工作量较大。而Maven依赖方式使用的仓库管理依赖的下载和更新,极大地减轻了人工管理的负担。 此外,使用jar包方式,项目的所有依赖都需要手动管理,容易出现版本不一致的问题。而Maven依赖方式可以通过声明依赖到一个整体的项目管理系统,使得依赖的版本控制更加方便,减少了版本冲突的可能性,同时也方便了团队协作和持续集成。 综上所述,Maven依赖方式相对于jar包方式具有更加灵活和便捷的依赖管理方式,能够帮助我们更好地管理项目的依赖,提高开发效率。 ### 回答3: jar包方式Maven依赖方式是软件开发常用的两种方式来管理和使用第三方库。它们有以下不同之处: 1. 管理方式不同: - Jar包方式:开发人员需要手动下载第三方库的jar包,并将其添加到项目的classpath。这种方式需要手动处理版本冲突和依赖关系。 - Maven依赖方式使用Maven作为项目管理工具,在项目的配置文件(pom.xml)声明依赖关系,Maven会自动下载并管理所需的jar包。Maven会解决版本冲突,并递归处理所有的依赖关系。 2. 依赖管理: - Jar包方式:需要手动下载和管理所有所需的jar包,包括它们的版本兼容性。 - Maven依赖方式:只需在pom.xml声明所需的依赖Maven会自动下载和管理所有的依赖。开发者只需关注需要的库,而不必担心版本兼容性和冲突问题。 3. 构建与部署: - Jar包方式:需要手动将所有的依赖jar包打包到可执行的jar文件,然后手动部署到目标环境。 - Maven依赖方式Maven会自动处理依赖并构建项目,生成可执行的jar文件。开发者只需使用Maven命令进行构建和部署,简化了整个过程。 4. 生态系统: - Jar包方式:开发人员需要在不同的库的官方网站或其他公共资源库搜索和下载所需的jar包。 - Maven依赖方式Maven央仓库是一个央化的资源库,包含了大量常用的库,开发者只需在配置文件指定库的GAV(Group ID、Artifact ID、Version)信息,Maven会自动从央仓库下载所需的库。 总体来说,Maven依赖方式相对于Jar包方式更加方便和高效。它能够自动处理依赖关系、解决版本冲突,同时提供了更简单的项目构建和部署流程,使开发者能够更专注于业务逻辑的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值