【问题标题】:Play framework/ SBT : compile/build project with two sets of dependencies respectivelyPlay framework/ SBT : 分别用两组依赖编译/构建项目
【发布时间】:2014-10-24 01:31:03
【问题描述】:

目前我正在构建一个连接到 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 项目,并生成两个可分别在 h1 和 h2 上运行的可部署 zip。

在探索各种方法时,我找到了最接近的一种: 在 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"),
)

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

因此,关于同时构建具有两组不同依赖项的项目的任何建议(或按照我/用户的指示选择一组进行构建),以便我/用户不必手动编辑 build.sbt ?或者对我更改播放项目输出目录的暂定解决方案有什么建议?

我已经被这个问题困扰了好几天,并且为此而发疯。感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:
    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
    

    【讨论】:

    • 感谢您的帮助!我试过了,它很好地解决了我们的问题:) @James Roper
    • 在 play 2.2.3 中我可以使用“ play -Dhadoop.version=1 dist ”
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2018-03-20
    相关资源
    最近更新 更多