Play framework / SBT:分别使用两组依赖项编译/构建项目

时间:2014-08-30 02:15:52

标签: playframework playframework-2.0 dependencies sbt playframework-2.2

目前我正在构建一个连接到hadoop jobtracker的Play项目(v2.2.3),这意味着我需要使用hadoop lib jars构建它

当我使用hadoop 1.x

时,它工作正常

现在我的项目想要支持hadoop1.x和hadoop2.x。但是由于h1和h2给出了不同的lib jar,我想分别用两组依赖项(hadoop1.x和hadoop 2.x)构建我的Play项目,并生成两个可部署的zip,分别可以在h1和h2上运行。 / p>

当我正在探索各种方式时,我找到了一个最接近的方法: 在build.sbt中,我使用相同的根目录(它是项目的根目录)创建了两个子项目,如:

lazy val h2 = Project("h2",file(".")).settings(
    version := "h2",
    libraryDependencies += "some hadoop2 dependency"
)

lazy val h1 = Project("h1",file(".")).settings(
    version := "h1",
    libraryDependencies += "some hadoop1 dependency"
)

但是当exec" play compile" :

overlapping output directories :  proj_root/target

我尝试通过更改输出目录来解决它,例如:

lazy val h1 = Project("h1",file(".")).settings(
    version := "h1",
    libraryDependencies += "some hadoop1 dependency"
    target in Compile := file("some_my_own_dir"),
)

但它不起作用。我无法更改项目的输出目录,错误消息保持不变。

所以有关同时构建具有两组不同依赖关系的项目的建议(或选择一组以我/用户指示构建),以便我/用户不必手动编辑构建名.bst?或者有关改变播放项目输出目标的暂定解决方案的任何建议?

我已经被困在这个问题好几天了,并且对此感到疯狂。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

libraryDependencies ++= if (sys.props.get("hadoop.version").exists(_ == "1")) Seq(
  // hadoop 1 dependencies
) else Seq(
  // hadoop 2 dependencies
)

然后:

$ activator -Dhadoop.version=1 dist
$ activator -Dhadoop.version=2 dist