SolrJ 9.3.0升级依赖冲突及测试异常问题求助
SolrJ 8.11.2 升级到9.3.0 问题解决指南
问题1:索引库测试失败(找不到Jetty类+Mockito无法mock final类)
1.1 解决org.eclipse.jetty.http.HttpFields$Mutable找不到的问题
SolrJ 9.x依赖的Jetty版本(Jetty 11+)和8.x(依赖Jetty 9/10)差异很大,HttpFields$Mutable在高版本Jetty里已经被重构或路径变更。解决步骤:
- 执行
mvn dependency:tree查看依赖树,找出冲突的旧版本Jetty依赖,在对应依赖中排除旧Jetty包。 - 在索引库的
pom.xml里通过dependencyManagement锁定Jetty版本为SolrJ 9.3.0对应的版本(可查SolrJ 9.3.0的pom确认,通常是Jetty 11.0.15左右):<dependencyManagement> <dependencies> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-bom</artifactId> <version>11.0.15</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 检查测试范围依赖,确保没有引入旧Jetty包,必要时显式声明正确的Jetty测试依赖。
1.2 解决Mockito无法mock final类Http2SolrClient的问题
SolrJ 9.x里Http2SolrClient被改成了final类,Mockito默认不支持mock final类,二选一解决:
- 添加
mockito-inline测试依赖:<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.x及以上兼容版本</version> <scope>test</scope> </dependency> - 创建Mockito扩展配置:
- 在
src/test/resources下新建mockito-extensions目录 - 新建文件
org.mockito.plugins.MockMaker,仅写入一行内容:mock-maker-inline
- 在
问题2:具体实现工程自动引入SolrJ 8.11.2导致NoSuchMethodError
核心是Maven依赖传递优先级问题,某个依赖间接引入了8.11.2版本,且优先级高于索引库的9.3.0。解决步骤:
- 强制锁定SolrJ版本:在具体实现工程的
pom.xml的dependencyManagement中显式指定9.3.0,确保所有传递依赖用该版本:<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>9.3.0</version> </dependency> </dependencies> </dependencyManagement> - 定位冲突来源:执行
mvn dependency:tree -Dverbose -Dincludes=org.apache.solr:solr-solrj,找到引入8.11.2的依赖,然后在该依赖中排除旧版SolrJ:<dependency> <groupId>冲突依赖的groupId</groupId> <artifactId>冲突依赖的artifactId</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> </exclusion> </exclusions> </dependency> - 检查索引库pom:确保SolrJ 9.3.0的依赖是
compile范围,没有被设为provided或其他会导致传递失效的范围。
内容的提问来源于stack exchange,提问作者Beqa Naveriani
相关产品推荐
相关产品推荐

