2.Maven坐标和依赖
1.Maven坐标
Maven定义了一组规则,用于标识构件的唯一性。这些元素包括:groupId、artifactId、version、packaging、classifier。通过这些元素我们就可以找到对应的构件。
org.springframework
spring-core
5.0.3.RELEASE jar
...
...
...
- 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。==这种依赖意味着潜在的风险。== 因为升级依赖的时候,相关传递性依赖的版本发生了变化,但是不易察觉。==容易导致项目出现错误。==
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理
- 烦恼和幸福