开发规范-Maven及IDEA解决maven依赖冲突

引(阿里巴巴开发规范-二方库依赖)

  1. 【强制】定义 GAV 遵从以下规则:
    1) GroupID 格式:com.{公司/BU }.业务线 [.子业务线],最多 4 级。
    说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。
    正例:com.taobao.jstorm 或 com.alibaba.dubbo.register
    2) ArtifactID 格式:产品线名-模块名。语义不重复不遗漏,先到中央仓库去查证一下。
    正例:dubbo-client / fastjson-api / jstorm-tool
    3) Version:详细规定参考下方。
  2. 【强制】二方库版本号命名方式:主版本号.次版本号.修订号
    1) 主版本号:产品方向改变,或者大规模 API 不兼容,或者架构不兼容升级。
    2) 次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的 API 不兼容修改。
    3) 修订号:保持完全兼容性,修复 BUG、新增次要功能特性等。
    说明:注意起始版本号必须为:1.0.0,而不是 0.0.1 正式发布的类库必须先去中央仓库进
    行查证,使版本号有延续性,正式版本号不允许覆盖升级。如当前版本:1.3.3,那么下一个
    合理的版本号:1.3.4 或 1.4.0 或 2.0.0
  3. 【强制】线上应用不要依赖 SNAPSHOT 版本(安全包除外)。
    说明:不依赖 SNAPSHOT 版本是保证应用发布的幂等性。另外,也可以加快编译时的打包构建。
  4. 【强制】二方库的新增或升级,保持除功能点之外的其它 jar 包仲裁结果不变。如果有改变,
    必须明确评估和验证,建议进行 dependency:resolve 前后信息比对,如果仲裁结果完全不一
    致,那么通过 dependency:tree 命令,找出差异点,进行排除 jar 包。
    阿里巴巴 Java 开发手册
    33/38
  5. 【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚
    举类型或者包含枚举类型的 POJO 对象。
  6. 【强制】依赖于一个二方库群时,必须定义一个统一的版本变量,避免版本号不一致。
    说明:依赖 springframework-core,-context,-beans,它们都是同一个版本,可以定义一
    个变量来保存版本:${spring.version},定义依赖的时候,引用该版本。
  7. 【强制】禁止在子项目的 pom 依赖中出现相同的 GroupId,相同的 ArtifactId,但是不同的
    Version。
    说明:在本地调试时会使用各子项目指定的版本号,但是合并成一个 war,只能有一个版本号
    出现在最后的 lib 目录中。可能出现线下调试是正确的,发布到线上却出故障的问题。
  8. 【推荐】所有 pom 文件中的依赖声明放在语句块中,所有版本仲裁放在
    语句块中。
    说明:里只是声明版本,并不实现引入,因此子项目需要显式的声
    明依赖,version 和 scope 都读取自父 pom。而所有声明在主 pom 的
    里的依赖都会自动引入,并默认被所有的子项目继承。
  9. 【推荐】二方库不要有配置项,最低限度不要再增加配置项。
  10. 【参考】为避免应用二方库的依赖冲突问题,二方库发布者应当遵循以下原则:
    1)精简可控原则。移除一切不必要的 API 和依赖,只包含 Service API、必要的领域模型对
    象、Utils 类、常量、枚举等。如果依赖其它二方库,尽量是 provided 引入,让二方库使用
    者去依赖具体版本号;无 log 具体实现,只依赖日志框架。
    2)稳定可追溯原则。每个版本的变化应该被记录,二方库由谁维护,源码在哪里,都需要能
    方便查到。除非用户主动升级版本,否则公共二方库的行为不应该发生变化。

补充:

在本地协作开发时经常会遇到自己的A模块依赖于其它项目(开发中)的B模块(Snapshot版本),在B模块更改后并没有及时deploy到私服环境之中导致A模块一直沿用旧模块(B.旧)的版本,在正式发布环境时倘若更改了B的核心模块就会导致A模块的编译错误。
所以在平时多模块协作开发时还需要遵守下面几项规则:
1,开发测试阶段使用SNAPSHOT,生产发布要使用RELEASE;
2,每个模块必须指定自己本次迭代的明确版本,不能使用默认的快照版本而一直不更改;
开发规范-Maven及IDEA解决maven依赖冲突_第1张图片
3,所有被其它模块引用的模块,在进行更改后必须及时deploy到私服环境之中,同时需要上传源码包(非保密模块),以便进行调试;
对于已废弃而其它模块正在使用的方法,建议不能直接进行删除,而是通过添加@Deprecated注解的方式明确指出当前版本中方法已过时,将会在下一个版本中进行删除,并同时指出其替代函数,对于所有@Deprecated注解的方法必须给出明确替代方案。经过@Deprecated注解的方法在javadoc生成时也会生成相应的提示。
开发规范-Maven及IDEA解决maven依赖冲突_第2张图片
4,为了避免因为不同版本的第三方引起的各种异常错误,对于冲突的maven依赖,必须排除其冲突版本,以保证明确指定版本的使用;

maven冲突jar包排除方法:

1,首先需要在IDEA中安装maven helper插件:
开发规范-Maven及IDEA解决maven依赖冲突_第3张图片
2,安装完成后重启IDEA,然后在pom文件夹下便会生成maven dependence的选项卡:
开发规范-Maven及IDEA解决maven依赖冲突_第4张图片
3,在该选项卡下有三个页面:
开发规范-Maven及IDEA解决maven依赖冲突_第5张图片
Conflicts:项目中所有具有冲突的jar包,白色为系统中共正在使用的jar包,红色代表的是冲入的jar包,可以在红色jar上通过右键Exclude的方式进行排除:
开发规范-Maven及IDEA解决maven依赖冲突_第6张图片
AllDependencies as List:代表是系统中所有正在用的jar包,红色代表的是冲突模块:
开发规范-Maven及IDEA解决maven依赖冲突_第7张图片
AllDependencies as Tree:查看maven依赖树,可以看到所有依赖的冲突,作用范围等等;

从这里我们可以看到所有jar包的scope,所以对于其他项目需要引入自己的模块时,对于一些公共jar包,本模块应该只提供provided的作用域,由调用方显示注明调用的版本,呼应《阿里规范》的10.1的建议。

你可能感兴趣的:(编程规范)