@@ -10,18 +10,26 @@ import scala.build.internal.{Constants, Runner, ScalaJsLinkerConfig}
10
10
import scala .build .options .{BuildOptions , JavaOpt , Platform }
11
11
import scala .build .{Build , BuildThreads , Inputs , Logger , Positioned }
12
12
import scala .cli .CurrentParams
13
+ import scala .cli .commands .run .RunMode
13
14
import scala .cli .commands .util .MainClassOptionsUtil ._
14
15
import scala .cli .commands .util .SharedOptionsUtil ._
15
16
import scala .cli .internal .ProcUtil
16
17
import scala .util .Properties
17
18
import scala .cli .config .{ConfigDb , Keys }
18
19
import scala .cli .commands .util .CommonOps .SharedDirectoriesOptionsOps
20
+ import scala .cli .commands .util .RunSpark
19
21
20
22
object Run extends ScalaCommand [RunOptions ] {
21
23
override def group = " Main"
22
24
23
25
override def sharedOptions (options : RunOptions ): Option [SharedOptions ] = Some (options.shared)
24
26
27
+ private def runMode (options : RunOptions ): RunMode =
28
+ if (options.sparkSubmit.getOrElse(false ))
29
+ RunMode .SparkSubmit
30
+ else
31
+ RunMode .Default
32
+
25
33
private def scratchDirOpt (options : RunOptions ): Option [os.Path ] =
26
34
options.scratchDir
27
35
.filter(_.trim.nonEmpty)
@@ -48,7 +56,29 @@ object Run extends ScalaCommand[RunOptions] {
48
56
javaOptions = baseOptions.javaOptions.copy(
49
57
javaOpts =
50
58
baseOptions.javaOptions.javaOpts ++
51
- sharedJava.allJavaOpts.map(JavaOpt (_)).map(Positioned .commandLine)
59
+ sharedJava.allJavaOpts.map(JavaOpt (_)).map(Positioned .commandLine),
60
+ jvmIdOpt = baseOptions.javaOptions.jvmIdOpt.orElse {
61
+ runMode(options) match {
62
+ case RunMode .SparkSubmit => Some (" 8" )
63
+ case RunMode .Default => None
64
+ }
65
+ }
66
+ ),
67
+ internalDependencies = baseOptions.internalDependencies.copy(
68
+ addRunnerDependencyOpt = baseOptions.internalDependencies.addRunnerDependencyOpt.orElse {
69
+ runMode(options) match {
70
+ case RunMode .SparkSubmit => Some (false )
71
+ case RunMode .Default => None
72
+ }
73
+ }
74
+ ),
75
+ internal = baseOptions.internal.copy(
76
+ keepResolution = baseOptions.internal.keepResolution || {
77
+ runMode(options) match {
78
+ case RunMode .SparkSubmit => true
79
+ case RunMode .Default => false
80
+ }
81
+ }
52
82
),
53
83
notForBloopOptions = baseOptions.notForBloopOptions.copy(
54
84
runWithManifest = options.useManifest
@@ -76,6 +106,7 @@ object Run extends ScalaCommand[RunOptions] {
76
106
def maybeRun (
77
107
build : Build .Successful ,
78
108
allowTerminate : Boolean ,
109
+ runMode : RunMode ,
79
110
showCommand : Boolean ,
80
111
scratchDirOpt : Option [os.Path ]
81
112
): Either [BuildException , Option [(Process , CompletableFuture [_])]] = either {
@@ -95,15 +126,17 @@ object Run extends ScalaCommand[RunOptions] {
95
126
allowExecve = allowTerminate,
96
127
jvmRunner = build.artifacts.hasJvmRunner,
97
128
potentialMainClasses,
129
+ runMode,
98
130
showCommand,
99
131
scratchDirOpt
100
132
)
101
133
}
102
134
103
135
processOrCommand match {
104
- case Right (process) =>
136
+ case Right (( process, onExitOpt) ) =>
105
137
val onExitProcess = process.onExit().thenApply { p1 =>
106
138
val retCode = p1.exitValue()
139
+ onExitOpt.foreach(_())
107
140
if (retCode != 0 )
108
141
if (allowTerminate)
109
142
sys.exit(retCode)
@@ -170,6 +203,7 @@ object Run extends ScalaCommand[RunOptions] {
170
203
val maybeProcess = maybeRun(
171
204
s,
172
205
allowTerminate = false ,
206
+ runMode = runMode(options),
173
207
showCommand = options.command,
174
208
scratchDirOpt = scratchDirOpt(options)
175
209
)
@@ -206,6 +240,7 @@ object Run extends ScalaCommand[RunOptions] {
206
240
val res = maybeRun(
207
241
s,
208
242
allowTerminate = true ,
243
+ runMode = runMode(options),
209
244
showCommand = options.command,
210
245
scratchDirOpt = scratchDirOpt(options)
211
246
)
@@ -226,9 +261,10 @@ object Run extends ScalaCommand[RunOptions] {
226
261
allowExecve : Boolean ,
227
262
jvmRunner : Boolean ,
228
263
potentialMainClasses : Seq [String ],
264
+ runMode : RunMode ,
229
265
showCommand : Boolean ,
230
266
scratchDirOpt : Option [os.Path ]
231
- ): Either [BuildException , Either [Seq [String ], Process ]] = either {
267
+ ): Either [BuildException , Either [Seq [String ], ( Process , Option [() => Unit ]) ]] = either {
232
268
233
269
val mainClassOpt = build.options.mainClass.filter(_.nonEmpty) // trim it too?
234
270
.orElse {
@@ -250,6 +286,7 @@ object Run extends ScalaCommand[RunOptions] {
250
286
finalArgs,
251
287
logger,
252
288
allowExecve,
289
+ runMode,
253
290
showCommand,
254
291
scratchDirOpt
255
292
)
@@ -262,9 +299,10 @@ object Run extends ScalaCommand[RunOptions] {
262
299
args : Seq [String ],
263
300
logger : Logger ,
264
301
allowExecve : Boolean ,
302
+ runMode : RunMode ,
265
303
showCommand : Boolean ,
266
304
scratchDirOpt : Option [os.Path ]
267
- ): Either [BuildException , Either [Seq [String ], Process ]] = either {
305
+ ): Either [BuildException , Either [Seq [String ], ( Process , Option [() => Unit ]) ]] = either {
268
306
269
307
build.options.platform.value match {
270
308
case Platform .JS =>
@@ -308,7 +346,7 @@ object Run extends ScalaCommand[RunOptions] {
308
346
esModule = esModule
309
347
)
310
348
process.onExit().thenApply(_ => if (os.exists(jsDest)) os.remove(jsDest))
311
- Right (process)
349
+ Right (( process, None ) )
312
350
}
313
351
}
314
352
value(res)
@@ -327,33 +365,50 @@ object Run extends ScalaCommand[RunOptions] {
327
365
logger,
328
366
allowExecve = allowExecve
329
367
)
330
- Right (proc)
368
+ Right (( proc, None ) )
331
369
}
332
370
}
333
371
case Platform .JVM =>
334
- if (showCommand) {
335
- val command = Runner .jvmCommand(
336
- build.options.javaHome().value.javaCommand,
337
- build.options.javaOptions.javaOpts.toSeq.map(_.value.value),
338
- build.fullClassPath,
339
- mainClass,
340
- args,
341
- useManifest = build.options.notForBloopOptions.runWithManifest
342
- )
343
- Left (command)
344
- }
345
- else {
346
- val proc = Runner .runJvm(
347
- build.options.javaHome().value.javaCommand,
348
- build.options.javaOptions.javaOpts.toSeq.map(_.value.value),
349
- build.fullClassPath,
350
- mainClass,
351
- args,
352
- logger,
353
- allowExecve = allowExecve,
354
- useManifest = build.options.notForBloopOptions.runWithManifest
355
- )
356
- Right (proc)
372
+ runMode match {
373
+ case RunMode .Default =>
374
+ if (showCommand) {
375
+ val command = Runner .jvmCommand(
376
+ build.options.javaHome().value.javaCommand,
377
+ build.options.javaOptions.javaOpts.toSeq.map(_.value.value),
378
+ build.fullClassPath,
379
+ mainClass,
380
+ args,
381
+ useManifest = build.options.notForBloopOptions.runWithManifest,
382
+ scratchDirOpt = scratchDirOpt
383
+ )
384
+ Left (command)
385
+ }
386
+ else {
387
+ val proc = Runner .runJvm(
388
+ build.options.javaHome().value.javaCommand,
389
+ build.options.javaOptions.javaOpts.toSeq.map(_.value.value),
390
+ build.fullClassPath,
391
+ mainClass,
392
+ args,
393
+ logger,
394
+ allowExecve = allowExecve,
395
+ useManifest = build.options.notForBloopOptions.runWithManifest,
396
+ scratchDirOpt = scratchDirOpt
397
+ )
398
+ Right ((proc, None ))
399
+ }
400
+ case RunMode .SparkSubmit =>
401
+ value {
402
+ RunSpark .run(
403
+ build,
404
+ mainClass,
405
+ args,
406
+ logger,
407
+ allowExecve,
408
+ showCommand,
409
+ scratchDirOpt
410
+ )
411
+ }
357
412
}
358
413
}
359
414
}
0 commit comments