From afa51729bb8ac344d1da2f3e7e509c7463c2b038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Wro=C5=84ski?= Date: Mon, 20 Sep 2021 09:56:50 +0200 Subject: [PATCH] Package standalone JARs --- .../scala/build/options/PackageOptions.scala | 4 ++++ .../main/scala/scala/cli/commands/Package.scala | 15 +++++++++++---- .../scala/scala/cli/commands/PackageOptions.scala | 5 ++++- website/docs/reference/cli-options.md | 4 ++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/modules/build/src/main/scala/scala/build/options/PackageOptions.scala b/modules/build/src/main/scala/scala/build/options/PackageOptions.scala index 2f470d3e66..30418ca899 100644 --- a/modules/build/src/main/scala/scala/build/options/PackageOptions.scala +++ b/modules/build/src/main/scala/scala/build/options/PackageOptions.scala @@ -3,6 +3,7 @@ package scala.build.options import scala.build.internal.Constants final case class PackageOptions( + standalone: Option[Boolean] = None, version: Option[String] = None, launcherApp: Option[String] = None, maintainer: Option[String] = None, @@ -24,6 +25,9 @@ final case class PackageOptions( def isDockerEnabled: Boolean = dockerOptions.isDockerEnabled.getOrElse(false) + // default behaviour for building docker image is building standalone JARs + def isStandalone: Boolean = standalone.getOrElse(isDockerEnabled) + } object PackageOptions { diff --git a/modules/cli/src/main/scala/scala/cli/commands/Package.scala b/modules/cli/src/main/scala/scala/cli/commands/Package.scala index 5e01f3f287..55d40fbafd 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Package.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Package.scala @@ -392,10 +392,17 @@ object Package extends ScalaCommand[PackageOptions] { val tmpJarContent = os.read.bytes(os.Path(tmpJar)) Files.deleteIfExists(tmpJar) - def dependencyEntries = build.artifacts.artifacts.map { - case (url, _) => - ClassPathEntry.Url(url) - } + def dependencyEntries = + build.artifacts.artifacts.map { + case (url, artifactPath) => + if (build.options.packageOptions.isStandalone) { + val path = os.Path(artifactPath) + ClassPathEntry.Resource(path.last, os.mtime(path), os.read.bytes(path)) + } + else { + ClassPathEntry.Url(url) + } + } val byteCodeEntry = ClassPathEntry.Resource(s"${destPath.last}-content.jar", 0L, tmpJarContent) val allEntries = Seq(byteCodeEntry) ++ dependencyEntries diff --git a/modules/cli/src/main/scala/scala/cli/commands/PackageOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/PackageOptions.scala index 704f7d86b2..4a126c1805 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/PackageOptions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/PackageOptions.scala @@ -33,7 +33,9 @@ final case class PackageOptions( @Group("Package") @HelpMessage("Generate an assembly JAR") assembly: Boolean = false, - + @Group("Package") + @HelpMessage("Package standalone JARs") + standalone: Option[Boolean] = None, @Recurse packager: PackagerOptions = PackagerOptions(), @Group("Package") @@ -71,6 +73,7 @@ final case class PackageOptions( baseOptions.copy( mainClass = mainClass.mainClass.filter(_.nonEmpty), packageOptions = baseOptions.packageOptions.copy( + standalone = standalone, version = Some(packager.version), launcherApp = packager.launcherApp, maintainer = packager.maintainer, diff --git a/website/docs/reference/cli-options.md b/website/docs/reference/cli-options.md index 267b300d6a..294e5e0ed5 100644 --- a/website/docs/reference/cli-options.md +++ b/website/docs/reference/cli-options.md @@ -428,6 +428,10 @@ Generate a library JAR rather than an executable JAR Generate an assembly JAR +#### `--standalone` + +Package standalone JARs + #### `--deb` Build debian package, available only on linux