【问题标题】:Uber jar with custom folder structure with IntelliJ and SBT带有 IntelliJ 和 SBT 的自定义文件夹结构的 Uber jar
【发布时间】:2020-07-25 04:01:55
【问题描述】:

我对云和 SBT/IntelliJ 还很陌生,所以尝试使用 IntelliJ & SBT 构建环境将我的 jar 部署到数据处理集群上。

这是我的项目结构的屏幕截图:

代码非常简单,main 定义在 'mytestmain' 中,它调用 'ReadYamlConfiguration' 中定义的另一个方法,该方法需要 moultingyaml 依赖项,我已将其包括在 build.sbt 中。

这是我的build.sbt & assembly.sbt 文件:

lazy val root = (project in file(".")).
  settings(
    name := "MyTestProjectNew",
    version := "0.0.1-SNAPSHOT",
    scalaVersion := "2.11.12",
    mainClass in Compile := Some("com.test.processing.jobs.mytestmain.scala")
  )

libraryDependencies ++= Seq(
  "net.jcazevedo" %% "moultingyaml" % "0.4.2"
)

scalaSource in Compile := baseDirectory.value / "src" 

assembly.sbt文件:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10")

我创建了 assembly.sbt 来创建 Uber jar 以包含所需的依赖项,并从终端运行 'SBT assembly'。它已经成功创建了一个程序集 jar 文件,我能够在 Dataproc 集群上成功部署和运行。

gcloud dataproc jobs submit spark \
--cluster my-dataproc-cluster \
--region europe-north1 --class com.test.processing.jobs.mytestmain \
--jars gs://my-test-bucket/spark-jobs/MyTestProjectNew-assembly-0.0.1-SNAPSHOT.jar

代码按预期正常运行,没有任何问题。

现在我想拥有自己的自定义目录结构,如下所示:

例如,我想要一个文件夹名称为 'spark-job' 和一个名为 'SparkDataProcessing' 的子目录,然后是 src/main/scala 文件夹,其中包含包和相应的 scala 类和对象等。

我的 main 方法在 'job' 包中的 'com.test.processing' 包中定义。

我需要在build.sbt 中进行哪些更改?根据我的项目结构,我正在寻找以build.sbt 作为示例的详细说明。还请建议gitignore 文件中需要包含的所有内容。

我正在使用IntelliJ Idea 2020 community editionSBT 1.3.3 版本。我在这里和那里尝试了一些东西,但总是以结构、jar 或build.sbt 问题告终。 我期待在下面的帖子中得到类似的答案。

Why does my sourceDirectories setting have no effect in sbt?

如下图所示,源目录已更改。

spark-jobs/SparkDataProcessing/src/main/Scala

当我用下面的路径构建它时,它不起作用。

scalaSource in Compile := baseDirectory.value / "src" 

当我保持默认结构时它可以工作。喜欢src/main/scala

【问题讨论】:

    标签: scala intellij-idea google-cloud-platform sbt sbt-assembly


    【解决方案1】:

    您还需要在受影响文件顶部的package 关键字之后更改包名称。但是,如果您使用 IntelliJ 进行重构(通过创建包,然后使用 UI 将文件拖到包中),那么 IntelliJ 将为您执行此操作。

    无需更改任何其他内容(build.sbt 和相关文件可以保持不变)。

    最后,记得更改class 参数以反映入口点位置的变化;你会通过--class com.test.processing.jobs.job.mytestmain 而不是--class com.test.processing.jobs.mytestmain

    至于.gitignore:请查看example gitignore file,其中包括:

    • 包含“目标”的输出目录
    • IntelliJ 目录,例如“.idea”

    Another gitignore example 忽略编译器生成的所有 .class 文件,这是另一种方法。您应该包括所有动态生成的文件,其中的更改对其他开发人员无关紧要。

    【讨论】:

    • 我的 build.sbt 仍然需要更改,因为现在更改了默认项目结构。
    • 这不能回答我的实际问题。你看我有两个子目录,然后是我的实际代码或主要方法所在的 src/main/Scala。所以如果我必须编译我的源而不是我的源目录的路径是什么?
    猜你喜欢
    • 2015-11-17
    • 2015-04-12
    • 2017-11-04
    • 2021-12-13
    • 2019-07-16
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多