【问题标题】:How to include python and Scala files all together in jar file using sbt?如何使用 sbt 将 python 和 Scala 文件一起包含在 jar 文件中?
【发布时间】:2020-12-24 08:00:28
【问题描述】:

目标:

用 scala 和 python 文件构建一个 jar 并将这个 jar 提供给 pyspark 并能够调用 scala 和 python 文件。主要的 执行将在将使用 scala 库的 python 文件中 内部使用 py4j。

如何在 jar 文件中包含 python 文件/包以及使用 SBT 的 scala 文件?

项目结构(开放以更改任何可行的方法)

parent_project
|
|-- child_project
    |
    |-- src
        |
        |-- main
            |
            |-- scala
                |
                |-- com.my_org.child_project
                    |
                    |-- s_file_1.scala
                    |-- s_file_2.scala
            |-- python
                |
                |-- foo
                    |
                    |-- p_file_1.py
                    |-- p_file_2.py
    |-- build.sbt                      -- for child project
|-- build.sbt                          -- for parent project

示例 build.sbt(用于子项目)

name := "child_project"
version := "1.0.0"
scalaVersion := "2.11.1"
val sparkVersion = "2.4.4"

lazy val dependencies = new {}

libraryDependencies ++= Seq()

示例 build.sbt(用于父项目)

lazy val child_project = project.in(file("parent_project/child_project"))
  .dependsOn(parent % "provided->provided;compile->compile;test->test;runtime->runtime")
  .settings(
    name := "child_project",
    organization := "com.my_org",
    unmanagedSourceDirectories in Compile += file("/parent_project/child_project/src/main/python"),
    includeFilter in (Compile, unmanagedSources) := "*.scala" || "*.java" || "*.py"
    assemblySettings
  )

SBT 版本 = 0.13.16

构建jar的SBT命令

"project child_project" assembly

具体问题:

  1. 是否可以在一个 jar 中同时包含 python 和 scala 代码?
  2. 是否可以将此 jar 提供给 pyspark 并从中访问 python 和 scala 文件?
  3. 有任何建议/解决方法/更好的选择来实现目标吗?

【问题讨论】:

    标签: scala apache-spark pyspark sbt


    【解决方案1】:

    我立即想到的一个解决方案是将.py 文件放在main/resources 目录下。这似乎更像是一种 hack,但可能是您想要的(尤其是对于 python 文件)。

    更好的解决方案是将main/python 定义为Add an additional source directory 中所述的源目录:

    sbt 从unmanagedSourceDirectories 中收集sources,默认情况下由scalaSourcejavaSource 组成。在适当的配置中将目录添加到unmanagedSourceDirectories 以添加源目录。例如,要将 extra-src 添加为包含主要源代码的附加目录,

    Compile / unmanagedSourceDirectories += baseDirectory.value / "extra-src"
    

    这将是您的build.sbt 中的以下内容:

    Compile / unmanagedSourceDirectories += baseDirectory.value / "python"
    

    【讨论】:

    • 试过这个,但不起作用。我已经更新了问题以反映此设置(父项目的 sbt)。甚至尝试将 python 文件保存在 scala 源中,这也不起作用。还添加了有问题的 SBT 版本 (0.13.16)。
    • 重试干净构建,删除目标目录,刷新 sbt 并重新启动 sbt shell。现在它似乎尊重设置,但由于编译错误而失败,显然是在构建 python 文件时。是否可以跳过 python 文件的编译?
    • 每次更改 build.sbt 都必须重新启动 sbt shell。 python 文件在哪里?
    • 谢谢! python 文件位于 /parent_project/child_project/src/main/python 目录中。
    • 标记为 parent_project/child_project/src/main/python 为资源文件夹。 SBT主要表现得很奇怪。有时它会将 python 文件放入 jar 中,有时则不会。无论如何,这是我采取的方法。在 build.sbt(父级)unmanagedResourceDirectories in Compile += file("/parent_project/child_project/src/main/python") 的项目定义中使用以下内容将 python 包标记为附加资源
    猜你喜欢
    • 2015-11-06
    • 2016-01-23
    • 1970-01-01
    • 2017-10-17
    • 2011-09-15
    • 2017-10-16
    • 1970-01-01
    • 2018-11-26
    • 2015-09-11
    相关资源
    最近更新 更多