如何使用 sbt 将 python 和 Scala 文件一起包含在 jar 文件中?



目标:

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

如何使用 SBT 将 python 文件/包与 scala 文件一起包含在 jar 文件中?

项目结构(可更改为任何有效的内容)

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. 是否可以将 python 和 scala 代码都包含在一个 jar 中?
  2. 是否可以将这个jar提供给pyspark并从中访问python和scala文件?
  3. 实现目标的任何建议/解决方法/更好的选择?

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

更好的解决方案是将main/python定义为源目录,如添加其他源目录中所述:

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

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

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

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

最新更新