目标:
用 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
具体问题:
- 是否可以将 python 和 scala 代码都包含在一个 jar 中?
- 是否可以将这个jar提供给pyspark并从中访问python和scala文件?
- 实现目标的任何建议/解决方法/更好的选择?
我立即想到的解决方案是将.py
文件放在main/resources
目录下。这似乎更像是一个黑客,但可能是你想要的(特别是对于python文件)。
更好的解决方案是将main/python
定义为源目录,如添加其他源目录中所述:
SBT从
unmanagedSourceDirectories
收集sources
,默认情况下由scalaSource
和javaSource
组成。在适当的配置中添加要unmanagedSourceDirectories
的目录以添加源目录。例如,要将 extra-src 添加为包含主要来源的附加目录,Compile / unmanagedSourceDirectories += baseDirectory.value / "extra-src"
在您的build.sbt
中,这将是以下内容:
Compile / unmanagedSourceDirectories += baseDirectory.value / "python"