`

Maven依赖管理的规则

    博客分类:
  • tool
阅读更多
硬依赖
指的就是必须由本模块来引入的依赖
传递依赖
当引入其它模块时,由于其它模块中已经有了某些jar包的依赖了,将自动把依赖关系导入到本模块
如,A模块已经配置了对hibernate的依赖,
当B模块中引入A模块的依赖时,hibernate的依赖将自动传入到B模块中。
此时,B模块中不用再配置hibernate的依赖了,会根据传递过来的依赖自动导入那些jar包!
依赖排除
由于有了传递性依赖的特征,当不想导入当前所引入的模块的依赖时,可以使用排除策略,将对应的依赖排除掉。

==================================================================



硬依赖
user-core模块
该模块用于定义实体类,需要的依赖的jar包:hibernate, mysql-connector, log4j, junit
依赖包的说明:
mysql-connector用来使用Java连接Mysql数据库
hibernate用来持久化对象
junit用来做单元测试
log4j用来做日志
依赖包的坐标通过上面的网址进行查询即可
则POM.xml配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.gc.user</groupId>
  <artifactId>user-core</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>user-core</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
   
    <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.6.Final</version>
</dependency>

   <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
   
    <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
                          
  </dependencies>
</project>

==================================================================



  传递依赖
user-dao模块
本模块主要功能是对对象进行持久化操作,当然就离不开hibernate的支持。
由于该模块需要使用到user-core模块中的实体,那么就需要引入user-core模块
那么,user-core模块就需要进行发布(deploy),当发布到私服上,本地就可以下载到该模块的jar包了
注意:
user-core模块中已经依赖了hibernate的jar包,当user-dao模块引入user-core模块时,
user-dao模块就不需要在pom.xml中配置对hibernate的依赖了,因为依赖会传递!
当然,由于user-core模块中对mysql-connector, log4j都有依赖,那么本模块也会自动引入它们!
注意:
依赖传递需要明确的两点:
1.依赖是否传递由scope来决定
2.传递的是依赖关系,而不是将jar包从A模块拷贝到B模块
由于Junit的scope定义为了test,所以该依赖关系不会传递到另一个模块中,
所以,本模块中如果要使用Junit,那么还需要配置对Junit的依赖!

本模块中的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.gc.user</groupId>
  <artifactId>user-dao</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>user-dao</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
   
     <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! -->  <dependency>
  <groupId>com.gc.user</groupId>
  <artifactId>user-core</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  </dependency>
  </dependencies>
</project>


依赖的scope属性
决定该依赖是否传递,是否被打入war包
scope=compile,默认范围,该范围的依赖传递最强,编译,打包,运行都需要;
scope=test,依赖不会传递,生成war包时不会导入;测试包不需要传递,也不需要打入到war包。
scope=provided,依赖不会传递,生成war包时不会导入。仅编译,测试时有用,与test范围有点类似,但是出发点不一样。如servlet-api,容器已经提供了,就不能再包含了,否则,会导致包冲突等异常发生。
scope=runtime,编译时没有依赖,运行时有依赖
scope=system,导入本地jar包,通过指定本地路径来导入
scope=import

依赖传递的冲突
本模块依赖其它几个模块,而这几个模块中对某个jar包的依赖版本不同,那么本模块将使用哪个依赖呢?
Maven将自动根据"最短路径原则"来确定!
最短路径原则:
如果本地显示依赖了某个jar包,则用本地的;
如果本地没有显示依赖,而是通过依赖传递依赖的某个jar包:
首先根据最短依赖原则确定;
如果路径长度都相同,则根据依赖书写顺序确定;
依赖的排除
Maven基于最短路径原则,解决了依赖冲突的问题,我们还可以通过依赖排除来进一步干涉依赖的传递行为。
如,引入user-core时,我不想使用user-core关于log4j的依赖,那么在引入user-core的时候,声明需要排除的依赖即可:
    <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! -->
  <dependency>
  <groupId>com.gc.user</groupId>
  <artifactId>user-core</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <exclusions>
  <!-- 排除user-core模块中关于log4j的依赖 -->
  <exclusion>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  </exclusion>
  </exclusions>
  </dependency>

依赖的显示声明,精确控制依赖的版本
基于Maven的最短路径原则解决了多个相同依赖冲突的问题
依赖排除又提供了一种依赖冲突的解决方案
此外,我们还可以直接在本模块中声明对某个jar包的依赖,优先级最高,冲突也就自动解决了
分享到:
评论

相关推荐

    rules_maven:具有Bazel的传递Maven依赖项

    规则用于处理传递Maven依赖项。 这里的“专家”一词是指“专家工件”,而不是工具“ mvn”。 此仓库利用gradle协助进行传递依赖项管理,因此提供了徽标参考。 规则 名称 描述 加载此仓库的依赖项。 声明一个外部...

    mabel:Bazel的Maven依赖图生成器

    产品特点从给定的Maven依赖关系列表中解决所有依赖关系,并管理版本冲突-确保依赖关系图中每个工件只有一个版本可用。 为所有远程工件生成存储库规则。 生成所需的Java规则(具有传递依赖项)。 自动检测要为给定...

    ApacheMaven(java项目管理工具)v3.6.1官方版(附Maven环境变量配置)

    它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来运行定义在生命周期阶段中插件目标的逻辑。Maven的缺省构建规则具有较高的可重用性,所以常常用两三行 Maven 构

    Maven-项目管理工具软件详解

    Maven是Apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 官网:https://maven.apache.org/ Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受...1. 依赖管理 2. 统一项目结构 3. 项目构建

    使用Maven整合ssm

    Maven是一个基于POM(项目对象模型)的项目管理工具。POM作为项目对象模型,通过xml来表示Maven项目,使用pom.xml来对项目进行...主要描述了:项目的配置文件,需要遵循的规则,项目的依赖性以及所有与项目有关的因素。

    Maven pom 配置详解

    pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。

    maven-examples:Maven示例

    要求通过配置(自定义)规则来满足环境约束(Maven和Java版本,属性等) Maven原型插件 原型生成示例Maven插件 Maven原型插件 允许从称为原型的现有模板创建Maven项目。 并从现有项目创建原型。 网站: :...

    maven配置篇之pom.xml

    开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。POM包括了所有的项目信息。maven相关:pom定义了最小的maven2元素,允许groupId,artifactId,version。...

    rules_jvm_external:用于解析,获取和导出Maven工件的Bazel规则

    rules_jvm_external 适用于...256校验和固定到版本可控的JSON文件中无版本目标标签可简化依赖管理能够声明多组版本化工件在Windows,macOS,Linux上受支持在获取。用法在WORKSPACE中列出顶级Maven工件和服务器: load

    Apache Maven项目构建工具-其他

    12、依赖性管理:Maven鼓励使用JAR和其他依赖性中央存储库。Maven带有一种机制,您的项目的客户端可以使用该机制从中央JAR存储库中下载构建项目所需的任何JAR,就像Perl的CPAN一样。这使Maven的用户可以在项目之间...

    gradle-java-lib-plugin:Java或Groovy库或gradle插件的Gradle Maven发布配置

    简化了POM配置和依赖性管理。 已准备好将配置的发布用于Maven Central(遵循所有中央规则)。 特征: 类似于Maven的jar配置将pom.xml和pom.properties放在jar中填写清单属性配置其他工件的任务(maven Central ...

    [计算机毕业设计]基于SSM的学术成果管理系统(源码+部署说明+演示视频+包运行).zip

    系统采用了MySQL作为数据库存储,通过Maven进行依赖管理和打包部署。 在系统设计上,我们充分考虑了用户体验和安全性。例如,在用户注册登录时采用了双重验证方式,确保账号密码的安全性;在信息录入时设置了必填项...

    [计算机毕业设计]基于SSM的新冠肺炎疫苗接种管理系统(源码+部署说明+演示视频+包运行).zip

    系统采用了MySQL作为数据库存储,通过Maven进行依赖管理和打包部署。 在系统设计上,我们充分考虑了用户体验和数据安全性。例如,在用户注册登录时采用了双重验证方式,确保账号密码的安全性;在个人信息录入时设置...

    URULE是一款基于RETE算法的纯Java规则引擎.zip

    支持项目创建、组织、构建自动化以及依赖管理,确保不同模块和组件之间的协调一致。 编译与构建: 包括编译器、构建工具(如Make、Gradle、Maven)等,用于将源代码转换为可执行文件或库,并进行资源打包、优化...

    DSL语法解析器生成器dropincc.java.zip

    maven依赖:  &lt;groupId&gt;com.github.pfmiles&lt;/groupId&gt;  &lt;artifactId&gt;dropincc.java  &lt;version&gt;0.2.2 手工下载:https://github.com/pfmiles/dropincc.java/releases Quick Start:...

    Gradle在大型Java项目上的应用

    Maven的CoC[1]、依赖管理以及项目构建规则重用性等特点,让Maven几乎成为Java构建工具的事实标准。然而,冗余的依赖管理配置、复杂并且难以扩展的构建生命周期,都成为使用Maven的困扰。Gradle作为新的构建工具,...

    jbpm7示例(jbpm-7.3.0.Final-examples)

    2017年jBPM 正式发布了全新的 7版本。jBPM 是一个完全开源的...如果您使用Maven,只需添加一个依赖关系pom.xml: &lt;groupId&gt;org.jbpm &lt;artifactId&gt;jbpm-test &lt;version&gt;7.3.0.Final 这与Gradle,Ivy和Buildr类似。

    本体语言java源码-swrlapi:用于处理SWRL规则和SQWRL查询语言的JavaAPI

    Maven Central 上。 它的依赖信息可以在这里找到: SWRLAPI 使用 来管理 OWL 本体。 以下示例说明了如何使用该库来使用 OWLAPI 创建的本体创建 SWRL 查询引擎,然后执行该本体中的规则。 // Create OWLOntology ...

    Tabletop-Pendragon-Ruleset:RPG Pendragon 的规则集

    所有其他依赖项都通过 Maven 处理,并在包含的 POM 文件中注明。 获取代码 代码可以在 GitHub。 要通过 Git 获取它,请使用以下克隆 URI: git clone https://github.com/Bernardo-MG/Tabletop-

Global site tag (gtag.js) - Google Analytics