代码之家  ›  专栏  ›  技术社区  ›  vikrant rana

带有IntelliJ和SBT自定义文件夹结构的Uber jar

  •  1
  • vikrant rana  · 技术社区  · 6 年前

    我对云相当陌生 SBT/IntelliJ ,所以试试我的运气 IntelliJ & SBT 构建在dataproc集群上部署jar的环境。

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

    Project Structure

    代码非常简单,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" 
    

    组装.sbt 文件:

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

    我创造了 组装.sbt 创建优步jar,以包含所需的依赖关系和ran '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类和对象等。

    我的主要方法在包中定义 'job' 在内部 'com.test.processing' 包裹。

    我需要做哪些更改 build.sbt ?我正在寻找详细的解释 build.sbt 根据我的项目结构作为示例。另外,请建议所有需要包含的内容 gitignore 文件。

    我正在使用 IntelliJ Idea 2020 community edition 和 SBT 1.3.3 版本。我在这里和那里尝试了很少的东西,但总是在结构、罐子或其他方面出现问题 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

    Custom Project Structure

    0 回复  |  直到 6 年前
        1
  •  3
  •   ELinda    6 年前

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

    其他一切都不需要改变( build.sbt 相关文件可以保持不变)。

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

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

    • 包含“target”的输出目录
    • IntelliJ目录,如“.eidea”

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

    推荐文章