SBT范围可以用于特定代码块的自定义库依赖项吗?

时间:2014-01-16 12:01:25

标签: scala hadoop cassandra sbt

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

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

1 个答案:

答案 0 :(得分:1)

您可以执行此操作,但必须将代码拆分到其中一个范围轴上:项目,配置,任务。可用于您的目的唯一轴是“项目”轴。因此,您必须创建一个multi-project sbt project并在其子项目中拆分代码。

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

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

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

这可以做到,但非常复杂。最好清理代码,因此您只依赖于一个版本的Hadoop库。