【问题标题】:sbt switch dependencies for runtime运行时的 sbt 切换依赖项
【发布时间】:2017-04-08 12:33:46
【问题描述】:

我正在开发一个使用 xgboost4j 的 spark 应用程序。 https://github.com/dmlc/xgboost/tree/master/jvm-packages

由于 jar 的本地 C 依赖关系,此包需要编译到本地架构。但是集群的架构与开发笔记本电脑不同。通过集群中的一个运行 sbt 程序集时,如何替换该程序包?或者你会建议通过 % "provided" 来解决这个问题吗?

【问题讨论】:

  • 能否为来自目标环境和开发环境的工件提供不同的分类器或工件 ID?如果是,那么您可以使用系统属性在 artifactID 之间切换(如其他问题中所述 - 我不想在确认之前发布答案;))
  • 你是说阶段?我认为这应该是可能的。

标签: apache-spark sbt sbt-assembly


【解决方案1】:

为(提供/编译)库使用后缀,如下所示:

val suffix = Option(System getProperty "provided").isDefined match {
    case true  => "provided"
    case false => "compile"
  }

libraryDependencies += "org.apache.spark" %% "spark-sql" % Spark.version % suffix

如果您需要 uberjar 中的所有 jar,请运行 sbt -Dprovided assembly

【讨论】:

  • 但这会在本地架构中编译吗?是即时执行编译吗?
  • @GeorgHeiler 它将使用以前编译的依赖项。那是我的问题 - 如果您可以在项目构建之前提供两个不同的 JAR,那么这个答案是正确的(我之前建议过,但 FaigB 是第一个,所以我不会重复发布)。如果您必须即时编译模块(在编译应用程序期间),我认为这个答案不正确
  • 所以我应该在本地构建一次名为 xgboost-local 的 xgboost4j jar 并为集群 xgboost-cluster 构建一次?
  • 两个选项:您可以按照自己编写的方式进行操作,也可以使用相同的工件 ID 构建,但在生产中您将使用提供的依赖项,由 --jar 选项添加到 Spark-Submit。本地存储库中的版本将用于开发人员机器,但集群上的 jar 将仅为集群编译,不包含在应用程序的 uber jar 中。两种选择都可以。只有在每次构建模块时都想编译 xgboost 时才会出现问题
猜你喜欢
  • 2017-05-20
  • 2017-04-08
  • 1970-01-01
  • 2013-08-08
  • 2018-03-20
  • 2019-04-02
  • 1970-01-01
  • 2013-12-29
  • 2016-06-19
相关资源
最近更新 更多