一、现状

dubbo-api 使用不规范,导致项目之间耦合高,隐藏风险大。

在项目开发过程中,不可避免的需要跨团队业务对接,对于api包的依赖,举例以供应链中的 tms-api 包为例:

maven 怎么排除jar maven排除依赖不起作用_版本号

问题:

1、对于业务对接的时候,服务与服务之间进行通信,我想依赖的 tms-api 包其实只是想要包本身(api中的接口、实体、常量类、异常类)。而现状是依赖tms-api导致引入了大量我不需要的jar。

2、现在对maven项目没有做版本管理。出现的问题是:比如:依赖tms-api的项目用的是log4j打印日志。而tms-api如果在后续的升级的过程中引入了logback将导致日志打印出现问题。

其实解决这个问题最直接暴力的方法就是:采用通配符全局排掉:

maven 怎么排除jar maven排除依赖不起作用_maven_02

最开始以为会生效,结果打出来的包并没有排除掉。不知道有没有小伙伴们也遇到过这样的问题。

二、解决办法

其实通过排除,最后发现是maven-assembly-plugin 的bug引起通配符不生效

解决这个问题有两个办法

方案1、升级maven-assembly-plugin

升级maven-assembly-plugin指定的版本,不要用默认的版本,显示指定版本号为3.1.1。

maven 怎么排除jar maven排除依赖不起作用_java_03

assembly主动指定版本号之后,前后对比:

maven 怎么排除jar maven排除依赖不起作用_版本号_04

maven 怎么排除jar maven排除依赖不起作用_maven_05

如上图所示,在pom.xml配置一致的情况下,指明assembly插件的版本号打包出来的jar只有33个,说明通配符排除生效。相反有302个,说明通配符排除未生效

方案2、maven-dependency-plugin配置

maven-dependency-plugin将依赖jar先输出到编译目录下,然后用assembly将jar包打到压缩包中。

要配置两个地方:

a、pom.xml配置

maven 怎么排除jar maven排除依赖不起作用_版本号_06

b、assembly配置

maven 怎么排除jar maven排除依赖不起作用_maven_07

三、展望

新增dubbo-api时,做到dubbo-api不依赖任何第三方依赖。如果一定要引用添加<optional>true</optional>标签,不要将依赖关系传递给引用方,让引用方显示配置。

做到dubbo-api不依赖任何第三方依赖。最重要的就是实体一定要体现分层。比如controller层实体写admin包中,dubbo层实体写在dubbo-api包中。数据持久层实体写在dubbo-provider中。