2.Maven坐标和依赖

1.Maven坐标
Maven定义了一组规则,用于标识构件的唯一性。这些元素包括:groupId、artifactId、version、packaging、classifier。通过这些元素我们就可以找到对应的构件。

org.springframework spring-core 5.0.3.RELEASEjar ... ... ...

  • 1.groupId
定义当前Maven项目隶属于的实际项目,通常定义为公司域名的倒写加实际项目简写。比如阿里巴巴(com.alibab.dubbo)
  • 2.artifactId
该元素定义实际项目中的一个Maven项目模块,通常做法是使用实际项目名称作为artifactId的前缀。比如(dubbo-client)
  • 3.version
该元素定义Maven项目当前所处的版本。通常命名方式为:主版本号.次版本号.修订号。(主版本号:产品方向改变,或者大规模API不兼容。次版本号:保持相对兼容,增加主要功能特性。修订号:保持完全兼容性,修复BUG、新增次要功能)起始版本为1.0.0
  • 4.packaging
该元素定义Maven的打包方式。jar生成jar包,war生成war包,pom就是作为父子工程的父工程,仅仅引用pom。
  • 5.scope
【2.Maven坐标和依赖】依赖范围
  • 6.optional
标记依赖是否可选
  • 7.exclusions
用来排除传递依赖
2.依赖范围
依赖范围是用来控制引入的jar与classpath的关系。(编译时的classpath、测试的classpath、运行classpath)
  • 1.compile
编译依赖范围。如果没有指定scope类型,默认为compile。此依赖范围的Maven范围对编译、测试、运行三种classpath都有效
  • 2.test
测试依赖范围。此依赖范围的Maven依赖,只对测试classpath有效。在编译主代码或者运行项目使用时无法使用此类Maven依赖。
  • 3.provided
已提供依赖。使用此依赖范围的Maven依赖,对于编译和测试classpath都有效。但是在运行时无效。eg:servlet-api。
因为通常java web程序都是运行在容器里面了,比如tomcat,而tomcat已经提供了此依赖,故无须再引入。
javax.servlet javax.servlet-api 4.0.0 provided

  • 4.runtime
运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但是在编译主代码无效。比如JDBC驱动实现。因为主代码编译的只需要JDK提供的JDBC接口。只有在执行和测试需要具体的实现类
3.传递性依赖
比如我们在引用Spring框架jar包的时候,在引入Spring Context jar包的时候,就无须引入spring-aop,或者spring-beans等等。因为Maven将这种传递依赖已经默认给我们加载好了。
4.排除依赖
传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理。但是有有时候也会带来问题。比如:当前项目有依赖了第三方依赖,但是第三方依赖了另一个不稳定的版本。这样不稳定性就会传递给本项目。这时候就需要排除不稳定的版本依赖。
com.icegreen greenmail 1.5.6 test com.sun.mail javax.mail

5.归类依赖
如果项目依赖同一个项目的不同的模块,依赖的版本的都相同,则为了便于管理,使用properties元素定义Maven属性,比如spring项目。
4.3.14.RELEASE

定义了上述的属性,则在Maven运行的时候会将POM文件所有的${spring.version}替换掉。
6.优化依赖
在软件开发过程中,会不断优化自己的代码。比如对Maven依赖,要及时去除多余的依赖。
查看当前项目的已解析的依赖
mvn dependency:list

以tree的形式展示已解析的依赖
mvn dependency:tree

查看未声明的依赖于声明但未使用的依赖
mvn dependency:analyze

[WARNING] Used undeclared dependencies found: [WARNING]org.springframework:spring-context:jar:4.3.14.RELEASE:compile [WARNING]org.springframework:spring-beans:jar:4.3.14.RELEASE:compile [WARNING] Unused declared dependencies found: [WARNING]com.icegreen:greenmail:jar:1.5.6:test

上面就是指项目中使用到的,但是没有显式申明的依赖,这里使用了未申明的spring-context。==这种依赖意味着潜在的风险。== 因为升级依赖的时候,相关传递性依赖的版本发生了变化,但是不易察觉。==容易导致项目出现错误。==

    推荐阅读