【问题标题】:Can SBT scopes be used for custom libraryDependencies for specific code blocks?SBT 范围可以用于特定代码块的自定义 libraryDependencies 吗?
【发布时间】:2014-02-05 07:51:26
【问题描述】:

我有一个简单的 SBT 项目,其中一个代码块从 HDFS 读取(需要某个版本的 Hadoop 的libraryDependencies),另一个代码块(需要另一个版本的 Hadoop 的libraryDependencies)将过滤后的结果写入 Cassandra .

可以使用SBT scopes 为两个代​​码块分配不同的libraryDependencies 吗?

【问题讨论】:

    标签: scala hadoop cassandra sbt


    【解决方案1】:

    您可以这样做,但您必须将代码拆分为范围轴之一:项目、配置、任务。唯一可用于您的目的的轴是“项目”轴。所以你必须创建一个multi-project sbt project 并将你的代码拆分到它的子项目上。

    但他不会解决你的问题。因为您将无法运行生成的应用程序。 Java 类加载器无法决定何时使用一个版本的 Hadoop,何时使用另一个版本。它将加载相关类的一个版本,然后在所有情况下使用它。

    对于此任务,您必须使用上下文感知类加载器。这方面的一个例子是OSGi container,如Apache Feilx。 OSGi 是版本感知的,可以在同一个 Java 进程中加载​​同一个库的不同版本。然后它将根据使用库的上下文引用正确版本的库的类。

    更准确地说:您必须将不同版本的 Hadoop 库转换为 OSGi 包。然后,您必须将代码拆分为多个 OSGi 包,每个包都依赖于其元数据(清单文件)中正确版本的 Hadoop 包。当您想启动您的应用程序时,您必须在 OSGi 容器中运行它。

    这可以做到,但相当复杂。最好清理你的代码,这样你就只依赖一个版本的 Hadoop 库。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 2016-05-18
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2017-06-11
      • 2016-08-17
      相关资源
      最近更新 更多