将avro设为Runtime依赖并排除Test传递依赖失败(sbt 1.10.10)
问题诊断与解决方案
你的配置未在Test任务中生效,核心原因是Test类路径同时包含了Runtime和Test范围的avro依赖:
- 你同时声明了
avro % Runtime和avro % Test,导致Test环境下存在两份avro依赖实例 - 对
avro % Test的排除规则仅作用于Test范围的avro传递依赖,但Runtime范围的avro带来的传递依赖依然会保留在Test类路径中,所以看起来排除没生效
解决方案1:精简依赖声明(推荐)
Test范围默认会继承Runtime的依赖,因此无需重复声明Test范围的avro。只需在Runtime范围配置一次排除规则,Test任务会自动继承带排除的avro依赖:
(avro % Runtime).excludeAll( ExclusionRule(organization = "com.fasterxml.jackson.core"), ExclusionRule(organization = "org.apache.commons"), ExclusionRule(organization = "org.slf4j"), )
解决方案2:排查依赖来源(如果必须保留双范围声明)
如果确实需要在Test范围单独引入avro,执行以下步骤:
- 运行
sbt test:dependencyTree命令,查看com.fasterxml.jackson.core、org.apache.commons、org.slf4j的具体来源 - 确认这些依赖是否由avro之外的其他Test依赖引入:如果是,需要针对对应依赖单独添加排除规则
- 确保双范围的排除规则都正确配置,且无拼写错误
验证方法
修改配置后,再次运行sbt test:dependencyTree,搜索目标组织的依赖,确认它们已从avro的传递依赖中消失。
内容的提问来源于stack exchange,提问作者Kristopher Kane
相关产品推荐
相关产品推荐

