我正在尝试将play版本4.4用作Play框架2.5.5项目中的Redis客户端库。看起来与play 2.5.5和生菜4.4使用的netty版本存在一些兼容性问题。
当redis客户端尝试连接到本地安装的redis服务器时,我看到java.nio.channels.UnresolvedAddressException
。我确保redis服务器运行正常。此外,我可以使用来自独立的基于maven的java项目中的生菜4.4连接到redis。
要解决这个问题,我通过明确指定netty依赖关系来重现独立maven项目中的问题,如下所示:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.20.Final</version>
</dependency>
我能够通过使用shaded-jar来解决maven项目中的问题,其中依赖项被重定位到com.lambdaworks
包以避免版本冲突,如https://github.com/lettuce-io/lettuce-core#binariesdownload中所述。要使用带阴影的jar,将'classifier'属性添加到具有值'shaded'的生菜依赖关系定义中,并且还指定了排除列表。如何使用build.sbt实现相同的效果?
根据http://www.scala-sbt.org/0.13/docs/Library-Management.html#Exclude+Transitive+Dependencies,我可以在build.sbt中指定排除项,但不确定如何设置分类器属性。只有排除列表,它似乎不起作用。
答案 0 :(得分:0)
最后,我可以通过在build.sbt中指定shaded
分类器和exclusions
来解决此问题,如下所示:
"biz.paluch.redis" % "lettuce" % "4.4.0.Final" classifier "shaded" excludeAll(
ExclusionRule(organization = "io.reactivex", artifact="rxjava"),
ExclusionRule(organization = "org.latencyutils", artifact="LatencyUtils"),
ExclusionRule(organization = "io.netty", artifact="netty-common"),
ExclusionRule(organization = "io.netty", artifact="netty-transport"),
ExclusionRule(organization = "io.netty", artifact="netty-handler"),
ExclusionRule(organization = "io.netty", artifact="netty-codec"),
ExclusionRule(organization = "com.google.guava", artifact="guava"),
ExclusionRule(organization = "io.netty", artifact="netty-transport-native-epoll"),
ExclusionRule(organization = "io.apache.commons", artifact="commons-pool2"))
)