scala 使用SBT生成具有外部依赖关系的瘦JAR

pod7payv  于 2023-06-23  发布在  Scala
关注(0)|答案(1)|浏览(129)

有没有一种简单的方法或插件来使用SBT生成一个具有外部依赖关系的瘦JAR?请记住,META-INF/MANIFEST.MF文件应该包含Class-Path中的库的完整列表。
我需要的是与Google Cloud Functions thin jar兼容的东西。
目前,我正在使用Uber jar,但我更喜欢使用其他格式。
我查了一下sbt-assembly和sbt-pack,但不走运。如果它们是解决方案,你能提供一个例子或链接吗?

zazmityj

zazmityj1#

以下是Gradle示例的粗略翻译

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.13.11"

lazy val prepareDeployment = taskKey[Unit]("prepare the deployment")
def filename(f: Attributed[File]): String = filename(f.data)
def filename(f: File): String = f.toPath.getFileName.toString

lazy val root = (project in file("."))
  .settings(
    name := "sbt-package-example",
    libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.15.2",
    Compile / packageBin / packageOptions += {
      def filename(f: Attributed[File]) = s"lib/${f.data.toPath.getFileName}"
      val dependencies = (Compile / dependencyClasspathAsJars).value
      Package.ManifestAttributes(
        "Class-Path" -> dependencies.map(filename).mkString(" ")
      )
    },
    prepareDeployment := {
      val mainJar = (Compile / packageBin).value
      val dependencies = (Compile / dependencyClasspathAsJars).value
      IO.copyFile(mainJar, target.value / "deployment" / filename(mainJar))
      for (dependency <- dependencies) {
        IO.copyFile(dependency.data, target.value / "deployment" / "lib" / filename(dependency))
      }
    }
  )

运行以下命令

sbt prepareDeployment

将在target下创建一个deployment目录,其中包含不带依赖项的主JAR和一个包含所有依赖项的lib目录。
此示例的MANIFEST.MF文件包含以下行:

Class-Path: lib/scala-library-2.13.11.jar lib/jackson-databind-2.15.2.ja
 r lib/jackson-annotations-2.15.2.jar lib/jackson-core-2.15.2.jar

包括Scala运行时和声明的对Jackson的依赖。

相关问题