Skip to content

Commit de5282e

Browse files
authored
Merge pull request #1167 from wleczny/pass-java-options-into-docker-image
Pass java options to new package
2 parents 1219843 + 21c3a8a commit de5282e

File tree

5 files changed

+89
-5
lines changed

5 files changed

+89
-5
lines changed

modules/cli-options/src/main/scala/scala/cli/commands/PackageOptions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ final case class PackageOptions(
1010
shared: SharedOptions = SharedOptions(),
1111
@Recurse
1212
watch: SharedWatchOptions = SharedWatchOptions(),
13+
@Recurse
14+
java: SharedJavaOptions = SharedJavaOptions(),
1315
@Recurse
1416
compileCross: CompileCrossOptions = CompileCrossOptions(),
1517
@Recurse

modules/cli/src/main/scala/scala/cli/commands/Package.scala

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ object Package extends ScalaCommand[PackageOptions] {
5454
// FIXME mainClass encoding has issues with special chars, such as '-'
5555

5656
val logger = options.shared.logger
57-
val initialBuildOptions = options.finalBuildOptions.orExit(logger)
57+
val initialBuildOptions = buildOptions(options)
5858
val threads = BuildThreads.create()
59-
6059
val compilerMaker = options.compilerMaker(threads)
6160
val docCompilerMakerOpt = options.docCompilerMakerOpt
6261

@@ -137,6 +136,16 @@ object Package extends ScalaCommand[PackageOptions] {
137136
}
138137
}
139138

139+
def buildOptions(options: PackageOptions) = {
140+
val finalBuildOptions = options.finalBuildOptions.orExit(options.shared.logger)
141+
val buildOptions = finalBuildOptions.copy(javaOptions =
142+
finalBuildOptions.javaOptions.copy(javacOptions =
143+
finalBuildOptions.javaOptions.javacOptions ++ options.java.allJavaOpts
144+
)
145+
)
146+
buildOptions
147+
}
148+
140149
private def doPackage(
141150
logger: Logger,
142151
outputOpt: Option[String],
@@ -167,7 +176,7 @@ object Package extends ScalaCommand[PackageOptions] {
167176
case (_, _) if build.options.notForBloopOptions.packageOptions.isDockerEnabled =>
168177
for (basePackageType <- basePackageTypeOpt)
169178
Left(new MalformedCliInputError(
170-
s"Unsuported package type: $basePackageType for Docker."
179+
s"Unsupported package type: $basePackageType for Docker."
171180
))
172181
Right(PackageType.Docker)
173182
case (_, Platform.JS) =>
@@ -176,7 +185,7 @@ object Package extends ScalaCommand[PackageOptions] {
176185
yield
177186
if (validPackageScalaJS.contains(basePackageType)) Right(basePackageType)
178187
else Left(new MalformedCliInputError(
179-
s"Unsuported package type: $basePackageType for Scala.js."
188+
s"Unsupported package type: $basePackageType for Scala.js."
180189
))
181190
validatedPackageType.getOrElse(Right(PackageType.Js))
182191
case (_, Platform.Native) =>
@@ -185,7 +194,7 @@ object Package extends ScalaCommand[PackageOptions] {
185194
yield
186195
if (validPackageScalaNative.contains(basePackageType)) Right(basePackageType)
187196
else Left(new MalformedCliInputError(
188-
s"Unsuported package type: $basePackageType for Scala Native."
197+
s"Unsupported package type: $basePackageType for Scala Native."
189198
))
190199
validatedPackageType.getOrElse(Right(PackageType.Native))
191200
case _ => Right(basePackageTypeOpt.getOrElse(PackageType.Bootstrap))
@@ -653,6 +662,7 @@ object Package extends ScalaCommand[PackageOptions] {
653662
val preamble = Preamble()
654663
.withOsKind(Properties.isWin)
655664
.callsItself(Properties.isWin)
665+
.withJavaOpts(build.options.javaOptions.javacOptions)
656666
val params = Parameters.Bootstrap(Seq(loaderContent), mainClass)
657667
.withDeterministic(true)
658668
.withPreamble(preamble)

modules/integration/src/test/scala/scala/cli/integration/PackageTestDefinitions.scala

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,4 +767,74 @@ abstract class PackageTestDefinitions(val scalaVersionOpt: Option[String])
767767
expect(mainClasses == Set(scalaFile1, scalaFile2, s"$scriptsDir.${scriptName}_sc"))
768768
}
769769
}
770+
771+
test("pass java options") {
772+
val fileName = "Hello.scala"
773+
val destFile = if (Properties.isWin) "hello.bat" else "hello"
774+
val (fooProp, barProp) = ("abc", "xyz")
775+
val inputs = TestInputs(
776+
Seq(
777+
os.rel / fileName ->
778+
s"""object Hello {
779+
| def main(args: Array[String]): Unit =
780+
| println(s"$${sys.props("foo")}$${sys.props("bar")}")
781+
|}
782+
|""".stripMargin
783+
)
784+
)
785+
inputs.fromRoot { root =>
786+
os.proc(
787+
TestUtil.cli,
788+
"package",
789+
fileName,
790+
"-o",
791+
destFile,
792+
"--java-prop",
793+
s"foo=$fooProp",
794+
"--java-opt",
795+
s"-Dbar=$barProp",
796+
"-f"
797+
).call(cwd = root)
798+
val output = os.proc(root / destFile).call(cwd = root).out.text().trim
799+
expect(output == s"$fooProp$barProp")
800+
}
801+
}
802+
803+
def javaOptionsDockerTest(): Unit = {
804+
val fileName = "Hello.scala"
805+
val imageName = "hello"
806+
val (fooProp, barProp) = ("abc", "xyz")
807+
val inputs = TestInputs(
808+
Seq(
809+
os.rel / fileName ->
810+
s"""object Hello {
811+
| def main(args: Array[String]): Unit =
812+
| println(s"$${sys.props("foo")}$${sys.props("bar")}")
813+
|}
814+
|""".stripMargin
815+
)
816+
)
817+
inputs.fromRoot { root =>
818+
os.proc(
819+
TestUtil.cli,
820+
"package",
821+
fileName,
822+
"--docker",
823+
"--docker-image-repository",
824+
imageName,
825+
"--java-prop",
826+
s"foo=$fooProp",
827+
"--java-opt",
828+
s"-Dbar=$barProp",
829+
"-f"
830+
).call(cwd = root)
831+
val output = os.proc("docker", "run", imageName).call(cwd = root).out.text().trim
832+
expect(output == s"$fooProp$barProp")
833+
}
834+
}
835+
836+
if (Properties.isLinux)
837+
test("pass java options to docker") {
838+
javaOptionsDockerTest()
839+
}
770840
}

website/docs/reference/cli-options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@ Binary directory
645645
## Java options
646646

647647
Available in commands:
648+
- [`package`](./commands.md#package)
648649
- [`console` / `repl`](./commands.md#console)
649650
- [`run`](./commands.md#run)
650651
- [`shebang`](./commands.md#shebang)

website/docs/reference/commands.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ Accepts options:
176176
- [dependency](./cli-options.md#dependency-options)
177177
- [directories](./cli-options.md#directories-options)
178178
- [help group](./cli-options.md#help-group-options)
179+
- [java](./cli-options.md#java-options)
179180
- [jvm](./cli-options.md#jvm-options)
180181
- [logging](./cli-options.md#logging-options)
181182
- [main class](./cli-options.md#main-class-options)

0 commit comments

Comments
 (0)