有没有一种简单的方法或插件来使用SBT生成一个具有外部依赖关系的瘦JAR?请记住,META-INF/MANIFEST.MF文件应该包含Class-Path中的库的完整列表。我需要的是与Google Cloud Functions thin jar兼容的东西。目前,我正在使用Uber jar,但我更喜欢使用其他格式。我查了一下sbt-assembly和sbt-pack,但不走运。如果它们是解决方案,你能提供一个例子或链接吗?
META-INF/MANIFEST.MF
Class-Path
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文件包含以下行:
target
deployment
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的依赖。
1条答案
按热度按时间zazmityj1#
以下是Gradle示例的粗略翻译
运行以下命令
将在
target
下创建一个deployment
目录,其中包含不带依赖项的主JAR和一个包含所有依赖项的lib
目录。此示例的
MANIFEST.MF
文件包含以下行:包括Scala运行时和声明的对Jackson的依赖。