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

jecbmhm3  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(494)

目标:
用scala和python文件构建一个jar,并将这个jar提供给pyspark,这样就可以同时调用scala和python文件。主要执行将在python文件中进行,该文件将使用py4j在内部使用scala库。
如何使用sbt在jar文件和scala文件中包含python文件/包?
项目结构(任何工程均可变更)

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文件?
有什么建议/解决方法/更好的实现目标的选择吗?

kqhtkvqz

kqhtkvqz1#

我马上想到的解决办法是 .py 下的文件 main/resources 目录。这看起来更像一个黑客,但可能是你想要的(尤其是python文件)。
更好的解决办法是 main/python 作为源目录,如中所述,添加其他源目录:
sbt收集 sourcesunmanagedSourceDirectories ,默认情况下包括 scalaSource 以及 javaSource . 将目录添加到 unmanagedSourceDirectories 在适当的配置中添加一个源目录。例如,要添加额外的src作为包含主源的附加目录,

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

那就是你的 build.sbt :

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

相关问题