- 问题描述
- 问题现象
- 解决思路
- 定位报错位置
- 验证猜想
- 明确目标
- 解决问题
- 踩到的坑
在项目开发中 全局使用的es版本为6.8.17 但是其中metric项目因业务原因 使用的es版本为6.5.4 所以项目运行时 根据gradle加载依赖规则 自动使用了高版本的jar包 两个包中的log4j版本一致 导致项目无法启动
问题现象 解决思路 定位报错位置根据报错信息 发现报错路径是org.elasticsearch/elasticsearch/6.8.17 但我metric服务的依赖为:
dependencies {
compile 'org.elasticsearch:elasticsearch:6.5.4'
compile 'org.elasticsearch.client:transport:6.5.4'
}
并没有直接依赖6.8.17 所以怀疑是间接依赖导致
验证猜想在查看gradle依赖关系的时候 (./gradlew 模块名:dependencies) 看到依赖关系如下
明确目标看到依赖情况 那现在的目的就是要去掉services-common下的es版本
由于services-common是整体依赖 不能完全去掉 且为全局引用
subprojects {
if (project != project(':services:common')) {
mainClassName = 'com.networknt.server.Server'
dependencies {
compile project(':services:common')
}
}
}
解决问题
但目前需要自定引用 所以要在全局引用去掉本模块
if(project != project(':services:ics-metric')){
dependencies {
compile project(':services:common')
}
}
然后在模块中 做自定义引用
compile (project(':services:common-ics')){
transitive = true
exclude group: "org.elasticsearch", module: 'elasticsearch'
exclude group: "org.elasticsearch.client", module: 'elasticsearch-rest-high-level-client'
}
再去看依赖关系时发现services-common下面除了es的包 都引进来了 项目正常启动 问题解决
踩到的坑- 不要过分依赖idea的ctrl跳转 会跳转进错误的包 要以日志为准
- compile 因用project的时候必须要用()括起来
- transitive = true 间接依赖开关要打开 不然只会对第一层依赖生效



