`
iqeq00
  • 浏览: 61480 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Maven 坐标和依赖

阅读更多

Maven 坐标和依赖

 

Maven 的一大功能就是管理项目依赖,为了能自动化的解析任何一个 Java 构件,Maven 必

须将他们唯一标识,这就是依赖管理的底层基础“坐标”。

 

1. Maven 坐标是什么

    世界上任何一个构件都可以使用 Maven 坐标唯一标识,这些构件其实也就是平时使用的一些 jar、

    war 等文件。例如:

 

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

 

    a) groupId

           定义当前 Maven 项目隶属的实际项目,groupId 的表示方式与 Java 包名的表示方式类似,

           通常与域名反向一一对应。

    b) artifactId

          该元素定义实际项目中的一个 Maven 项目(模块),推荐的做法是使用实际项目名称作为

          artifactId的前缀,好处在于方便寻找实际的构件(构件组)。

    c) version

           定义 Maven 项目所处的版本,Maven 定义了一套完整的版本规范。

    d) packaging

           定义 maven 项目的打包方式,默认值是 jar。

    e) classifier

           定义构建输出一些附属构件,附属构件与主构件对应,例如:javadoc.jar、

           sources.jar,这样附属构件也拥有了自己唯一的坐标。

 

上述 5 个元素,groupId、artifactId、version 是必须要定义的,packaging 是可选的,

classifier 是不能直接定义的。项目构件名的文件名是与坐标相对应的,

一般规则为artifactId-version[-classifier].packaging , [-classifier] 表 示 可 选 。

packing 并非一定与构件扩展名对应,比如 packing 为 maven-plugin 的构件扩展名为 jar。

 

2. 依赖的配置

    跟元素 project 下的 dependencies 可以包含一个或者多个 dependency 元素,

    以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

 

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

 

    a) groupId、artifactId和version

           依赖的基本坐标,Maven根据坐标才能找到需要的依赖。

    b) type

           依赖的类型,对应项目坐标定义的packaging,默认值是jar,大部分情况下,

           该元素不必声明。

     c) scope

           依赖范围就是用来控制三种classpath(编译classpath、测试classpath、运行classpath)的关系。

           i.   compile

                编译依赖范围。如果没有指定,就会使用该默认依赖范围。此依赖范围对编译、

                测试、运行三种classpath都有效。例如:spring-core

           ii.   test

                测试依赖范围。只对于测试classpath有效。例如:Junit

           iii. provided

               已提供依赖范围。对于编译和测试classpath都有效,但在运行时无效。

               例如:servlet-api

          iv.  runtime

               运行时依赖范围。对于测试和运行classpath有效,但在编译主代码使无效。

               例如:JDBC驱动

          v.  system

               系统依赖范围。与classpath的关系和provided依赖范围完全一致。

               只是system范围的依赖必须通过systemPath元素显示的指定依赖文件路径。

               这类依赖不通过maven仓库解析,往往和本机系统绑定,

               可能造成构建的不可移植,应当谨慎使用。

          vi.  import

               导入依赖范围。不会对三种classpath产生实际的影响(暂且不管)。

    d) optional

           标记依赖是否可选。

           在理想的情况下,是不应该使用可选依赖的。使用可选依赖的原因是某一个项目实现可多个特性,

           在面向对象设计中,有个单一职责性原则,意指一个类应该只有一项职责,而不是柔和太多的功能。

           如:mySQL驱动、postgreSQL驱动。

     e) exclusions

          用来排除传递性依赖。

          传递性依赖会给项目隐式的引入很多依赖,这极大的简化了项目依赖的管理。

          但也会带来相应的问题。例如:SNAPSHOT版本的jar不稳定性。

          代码中使用exclusions元素声明排出依赖,可以包含一个或者多个exclusion子元素,

          所以可以排出一个或者多个传递性依赖。使用此元素只需要groupId和artifactId,

          而不需要version。

 

3. 传递性依赖

    如果项目里面的一个依赖,依赖于另外的依赖,那么这个另外的依赖,不需要你手动引入,

    也会自动依赖进来,就像传递的感觉一样。Maven 会解析各个直接依赖的 POM,

    将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。

    例如:A -> B B -> C ==> A -> C


 

    a) 当第二依赖的范围是 compile 的时候,传递性依赖的范围与第一直接依赖的范围一致。

    b) 当第二直接依赖的范围是 test 的时候,依赖不会得以传递。

    c) 当第二依赖的范围是 provided 的时候,只传递第一直接依赖范围也为 provided的依赖,

          且传递性依赖的范围同样为 provided。

   d) 当第二直接依赖的范围是 runtime 的时候,传递性依赖的范围与第一直接依赖的范围一致,

         但 compile 例外,此时传递的依赖范围为 runtime。

 

4. 依赖调解

    传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,

    大部分情况我们只需要关心项目的直接依赖,而不考虑这些直接依赖会引入什么传递性依赖。

    不过有的时候,也会造成不小的问题。

    a) 调解第一原则:

           传递性依赖中,路径最近者优先。

    b) 调解第二原则:

           第一声明者优先。在依赖路径长度相等的前提下,

           在 POM 中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜。

 

5. 最佳实践

    a) 排除依赖

          2. e)章节已讲。

    b) 归类依赖

          一类的依赖一起引入,一个项目不同的子模块。例如:spring-aop,spring-core。

    c) properties 定义 maven 属性

          properties 元素定义的属性,可以使用美元符号和大括弧环绕的方式引入 Maven属性。

          例如:${spring.version}

    d) 优化依赖

           i.   dependency:list

                显示已解析树。

           ii.  dependency:tree

                显示当前依赖树。

           iii. dependency:analyze

                分析当前项目的依赖。

                1) Use undeclared dependencies

                      项目使用到,但是没有显示声明的依赖,这意味着隐藏风险,

                      所以应该显示声明任何项目中直接用到的依赖。

                2) Use declared dependencies

                      项目中没有使用到,但是却显示声明的依赖。这类别的依赖,不能轻易删除声明,

                      应该仔细分析项目中是否有使用到。比如:analyze 指令只分析编译主代码和测试代码时

                      用到的依赖,一些执行测试和运行时需要的依赖发现不了。

 

 

  • 大小: 27.2 KB
  • 大小: 31.8 KB
1
2
分享到:
评论

相关推荐

    Maven中的依赖

    7. **依赖管理和继承**:在大型项目中,可以通过创建父POM来集中管理公共依赖和插件,子项目通过继承父POM来继承这些配置。 8. **版本管理和生命周期**:Maven的版本管理允许我们轻松地升级或降级依赖版本。生命...

    三. 坐标和依赖

    2. **Maven坐标**:在Maven中,每个依赖由三部分组成,即groupId(表示项目或组织的唯一标识)、artifactId(项目或模块的标识)和version(该组件的版本号)。 3. **依赖的传递性**:如果项目A依赖于B,B又依赖于C...

    maven_package 依赖包(完整)

    在POM中声明所需依赖,Maven会根据设定的坐标(groupId、artifactId、version)从Maven中央仓库或其他指定的远程仓库下载对应的jar包。例如,`&lt;dependency&gt;`标签用于声明项目依赖,`&lt;dependencies&gt;`标签则用于包含...

    maven依赖小例子

    这里的`groupId`、`artifactId`和`version`共同构成了Maven坐标,用于唯一标识一个依赖。Maven会根据这个坐标从中央仓库或其他配置的远程仓库下载对应的JAR文件。 Maven依赖管理遵循“传递性”原则,即如果你的项目...

    Maven的依赖验证项目

    这里的`groupId`、`artifactId`和`version`共同构成了Maven坐标,用于唯一标识一个项目或库。Maven会根据这些信息从Maven中央仓库或其他指定的远程仓库下载对应的jar文件。 Maven的依赖机制遵循“传递性”原则,这...

    Maven本地仓库依赖环境

    这里`groupId`、`artifactId`和`version`共同构成了Maven的坐标,用于唯一标识一个库。 总的来说,理解并掌握Maven的本地仓库和依赖管理对于JavaWeb开发者至关重要,它能够简化项目构建过程,提高开发效率,并确保...

    Maven 依赖详细理解.pdf

    POM文件是Maven项目的核心,它是一个xml文件,用于定义项目的构建配置和管理项目依赖。 首先,我们来看一下Maven项目的POM文件。POM文件定义了项目的基本信息,如项目组ID(groupId)、项目ID(artifactId)、项目版本...

    jodconverter2.2.2.jar Maven依赖包

    在这个例子中,'com\'暗示了groupId可能是'com.artofsolving\',这是一个假设的组织名,实际的groupId应在解压前查看Maven依赖的完整坐标。 标签“jodconverter”、“maven”、“jar”和“java”揭示了几个关键点:...

    maven中的mybatis依赖

    1. **groupId**:这是所有Maven坐标的第一部分,类似于Java包名,用于唯一标识一个项目或组织。这里的`org.mybatis`表示这个依赖属于MyBatis组织。 2. **artifactId**:这是Maven坐标的一部分,用于标识同一个项目...

    maven-dubbo-consumer

    1. **Maven**:Maven是Java项目管理工具,用于构建、依赖管理和项目信息管理。在这个项目中,Maven负责编译源代码、运行测试、打包应用,并管理项目的依赖关系。 2. **Dubbo**:Dubbo的核心功能包括服务注册与发现...

    JxBrowser开发maven仓库jar包

    Maven仓库是存储项目依赖的地方,分为中央仓库和本地仓库。中央仓库是默认的依赖源,包含了大量开源项目的jar包。而本地仓库则是Maven在本机上创建的一个临时存储库,用于缓存从远程仓库下载的依赖。 当"JxBrowser...

    Maven原理和实践-培训课件.ppt

    何为Maven 构建,依赖管理,项目信息聚合 Maven核心概念 坐标,依赖,仓库,生命周期,插件 Maven最佳实践 创建、打包、发布、版本管理 项目实战 Nexus(Todo…) M2eclipse(Todo…)

    grails3.2.8的maven依赖

    在实际开发中,Grails 3.2.8与Maven的结合使得开发者能够充分利用Maven的强大功能,如依赖管理和构建自动化,同时享受Grails带来的便捷和高效。通过熟练掌握这两个工具的集成使用,你可以更有效地构建和管理复杂的...

    构建之源:Maven 坐标(GroupID、ArtifactID、Version)全解析

    它由 Apache 软件基金会提供支持,用于管理项目构建、依赖和文档等过程。Maven 的设计灵感来源于早期的软件构建工具如 Ant,但它引入了一些新的概念,使得项目构建过程更加简洁和易于管理。 ### Maven 的主要特点:...

    普通Maven项目,Java,Maven,依赖

    - POM:每个Maven项目都有一个POM.xml文件,它包含了项目的配置信息,如项目坐标(groupId, artifactId, version)、依赖、构建指令等。 - 依赖管理:Maven通过POM文件中的标签来管理项目依赖,自动下载并管理这些...

    maven 3.5.2 maven 3.5.2 maven 3.5.2

    2. **编辑POM**: 修改POM.xml文件,添加项目依赖和配置信息。 3. **构建项目**: 使用`mvn compile`进行编译,`mvn test`运行测试,`mvn package`打包项目,`mvn install`将项目安装到本地仓库。 4. **部署项目**: ...

    maven 构建好的 IK 分词器,可直接使用

    "Maven 构建好的 IK 分词器,可直接使用" 这个标题告诉我们,这里提供的是一个已经使用 Maven 构建完成的 IK 分词器,专为 Elasticsearch 2.2 版本设计。IK 分词器是针对中文文本进行分词处理的工具,通常用于提高...

    maven下载QRCode.jar包

    假设`QRCode.jar`的Maven坐标为`com.qrcode:qrcode:1.0.0`,在你的项目的`pom.xml`文件中,你可以添加以下依赖: ```xml &lt;groupId&gt;com.qrcode&lt;/groupId&gt; &lt;artifactId&gt;qrcode &lt;version&gt;1.0.0 ``` 添加完...

Global site tag (gtag.js) - Google Analytics