0

目前我建立一个连接到Hadoop的JobTracker的一个游戏项目(V2.2.3),这意味着我需要用Hadoop的lib罐子构建它的编译/构建项目播放框架/ SBT:有两套分别依赖

当我使用hadoop 1.x工作正常

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

当我正在探索各种方式,我发现最近的一个: 在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" 
) 

但是当高管“打纂”这给出了一个错误:

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"), 
) 

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

因此,关于在同一时间使用两个不同的依赖关系构建项目的任何建议(或选择一个以I /用户指示构建的集合),以便我/用户不必手动编辑构建。 SBT?或者对我的试验性解决方案有任何改变播放项目输出目录的建议?

我一直在这个问题上停留了好几天,并且为此疯狂起来。感谢帮助!

回答

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 
+0

感谢您的帮助!我试了一下,它很好地解决了我们的问题:) @James Roper – user2457766 2014-09-02 18:28:55

+0

在游戏2.2.3中,我可以使用“play -Dhadoop.version = 1 dist” – user2457766 2014-09-02 18:31:57