在任何java构建管理器(maven,gradle,sbt等)中定义包冲突解决优先级

时间:2017-09-02 18:44:40

标签: java maven gradle dependencies sbt

我正在Cloudera Hive和Spark 5.10.2上构建一个项目。

当我尝试使用Thrift客户端发送请求时,我收到以下错误:

ERROR HiveConnection: Error opening session
org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{use:database=default})
    at org.apache.thrift.TApplicationException.read(TApplicationException.java:111)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:79)
    at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:156)
    at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:143)
    at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:583)
    at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:192)
    at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)

深入研究项目的依赖关系树我发现问题是由Cloudera的hive-exec中的一个脏猴子补丁引起的,其中定义了以下依赖关系:

<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>${libthrift.version}</version>
</dependency>

但是,thrift代码生成也用于生成另一组libthrift实现,它最终会在类路径中存在两个实现,其中一个实现随机加载。

我正在寻找maven,gradle或sbt的插件,以便在两者都存在时始终加载生成的libthrift版本,并且只在没有其他选择的情况下加载静态版本,即在hive中声明包 - exec在libthrift中具有更高的优先级。是否可以在整个Java生态系统中这样做?

非常感谢你的想法!

1 个答案:

答案 0 :(得分:0)

你试过maven dependency exclusion吗?
处理依赖项时有一些有用的东西:mvn help:effective-pommvn dependency:tree