我怎样才能使HBase与sbt的依赖关系管理很好地配合?

问题描述

| 我正在尝试进行一个使用CDH3的Hadoop和HBase的sbt项目。我正在尝试使用project / build / Project.scala文件声明对HBase和Hadoop的依赖关系。 (我承认我对sbt,maven和ivy的掌握有些薄弱。如果我要说或做些愚蠢的事情,请原谅我。) 一切都与Hadoop依赖关系紧密相连。添加HBase依赖关系会导致对Thrift 0.2.0的依赖关系,对于此关系似乎没有回购协议,或者从SO帖子中听起来很像。 所以,实际上,我有两个问题: 1.老实说,我不想依赖Thrift,因为我不想使用HBase的Thrift接口。有没有办法告诉sbt跳过它? 2.是否有更好的方法进行设置?我应该只将HBase jar转储到lib目录中并继续吗? 更新这是完成我想要的工作的sbt 0.10 build.sbt文件
scalaVersion := \"2.9.0-1\"

resolvers += \"ClouderaRepo\" at \"https://repository.cloudera.com/content/repositories/releases\"

libraryDependencies ++= Seq(
  \"org.apache.hadoop\" % \"hadoop-core\" % \"0.20.2-cdh3u0\",\"org.apache.hbase\" % \"hbase\" % \"0.90.1-cdh3u0\"
)

ivyXML :=
  <dependencies>
    <exclude module=\"thrift\"/>
  </dependencies>
    

解决方法

        查看HBase POM文件,Thrift位于回购协议中,网址为http://people.apache.org/~rawson/repo。您可以将其添加到您的项目中,并且它应该找到Thrift。我以为SBT会解决这个问题,但这是SBT,Ivy和Maven的交集,因此谁能真正说出真正应该发生的事情。 如果您确实不需要Thrift,则可以使用内联Ivy XML排除依赖项,如SBT Wiki上所述。
override def ivyXML = 
  <dependencies>
    <exclude module=\"thrift\"/>
  </dependencies>
回复:将罐子转储到lib目录中,这将是短期收益,长期损失。这当然是更方便的做法,如果这是某种概念上的证明,那么您下周将要扔掉它,请确保将它放进罐子中,然后将其忘记。但是,对于任何寿命超过几个月的项目,都值得花一些时间来正确进行依赖项管理。 尽管所有这些工具都面临挑战,但好处是: 依赖性分析可以告诉您何时直接依赖性具有冲突的传递性依赖性。在使用这些工具之前,这通常会导致怪异的运行时行为或未找到方法的异常。 升级非常简单。只需更改版本号,更新,就可以完成。 它避免了将二进制文件提交到版本控制。合并分支时,它们可能会出现问题。 除非您对在lib目录中对二进制文件进行版本控制有明确的策略,否则很容易忘记所拥有的版本。     ,        我在github上有一个带Hadoop的sbt项目的非常简单的示例:https://github.com/deanwampler/scala-hadoop。 查看
project/build/WordCountProject.scala
,在其中定义了一个名为
ClouderaMavenRepo
的变量(该变量定义了Cloudera存储库位置)和一个名为
hadoopCore
的变量,该变量定义了Hadoop jar的特定信息。 如果在浏览器中转到Cloudera存储库,则应该能够导航到Hive的相应信息。