@@ -10,18 +10,30 @@ 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 .{RunHadoop , 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.standaloneSpark.getOrElse(false ) && ! options.sparkSubmit.contains(false ))
29
+ RunMode .StandaloneSparkSubmit
30
+ else if (options.sparkSubmit.getOrElse(false ))
31
+ RunMode .SparkSubmit
32
+ else if (options.hadoopJar)
33
+ RunMode .HadoopJar
34
+ else
35
+ RunMode .Default
36
+
25
37
private def scratchDirOpt (options : RunOptions ): Option [os.Path ] =
26
38
options.scratchDir
27
39
.filter(_.trim.nonEmpty)
@@ -48,7 +60,31 @@ object Run extends ScalaCommand[RunOptions] {
48
60
javaOptions = baseOptions.javaOptions.copy(
49
61
javaOpts =
50
62
baseOptions.javaOptions.javaOpts ++
51
- sharedJava.allJavaOpts.map(JavaOpt (_)).map(Positioned .commandLine)
63
+ sharedJava.allJavaOpts.map(JavaOpt (_)).map(Positioned .commandLine),
64
+ jvmIdOpt = baseOptions.javaOptions.jvmIdOpt.orElse {
65
+ runMode(options) match {
66
+ case RunMode .StandaloneSparkSubmit | RunMode .SparkSubmit | RunMode .HadoopJar =>
67
+ Some (" 8" )
68
+ case RunMode .Default => None
69
+ }
70
+ }
71
+ ),
72
+ internalDependencies = baseOptions.internalDependencies.copy(
73
+ addRunnerDependencyOpt = baseOptions.internalDependencies.addRunnerDependencyOpt.orElse {
74
+ runMode(options) match {
75
+ case RunMode .StandaloneSparkSubmit | RunMode .SparkSubmit | RunMode .HadoopJar =>
76
+ Some (false )
77
+ case RunMode .Default => None
78
+ }
79
+ }
80
+ ),
81
+ internal = baseOptions.internal.copy(
82
+ keepResolution = baseOptions.internal.keepResolution || {
83
+ runMode(options) match {
84
+ case RunMode .StandaloneSparkSubmit | RunMode .SparkSubmit | RunMode .HadoopJar => true
85
+ case RunMode .Default => false
86
+ }
87
+ }
52
88
),
53
89
notForBloopOptions = baseOptions.notForBloopOptions.copy(
54
90
runWithManifest = options.useManifest
@@ -76,6 +112,7 @@ object Run extends ScalaCommand[RunOptions] {
76
112
def maybeRun (
77
113
build : Build .Successful ,
78
114
allowTerminate : Boolean ,
115
+ runMode : RunMode ,
79
116
showCommand : Boolean ,
80
117
scratchDirOpt : Option [os.Path ]
81
118
): Either [BuildException , Option [(Process , CompletableFuture [_])]] = either {
@@ -95,15 +132,17 @@ object Run extends ScalaCommand[RunOptions] {
95
132
allowExecve = allowTerminate,
96
133
jvmRunner = build.artifacts.hasJvmRunner,
97
134
potentialMainClasses,
135
+ runMode,
98
136
showCommand,
99
137
scratchDirOpt
100
138
)
101
139
}
102
140
103
141
processOrCommand match {
104
- case Right (process) =>
142
+ case Right (( process, onExitOpt) ) =>
105
143
val onExitProcess = process.onExit().thenApply { p1 =>
106
144
val retCode = p1.exitValue()
145
+ onExitOpt.foreach(_())
107
146
if (retCode != 0 )
108
147
if (allowTerminate)
109
148
sys.exit(retCode)
@@ -170,6 +209,7 @@ object Run extends ScalaCommand[RunOptions] {
170
209
val maybeProcess = maybeRun(
171
210
s,
172
211
allowTerminate = false ,
212
+ runMode = runMode(options),
173
213
showCommand = options.command,
174
214
scratchDirOpt = scratchDirOpt(options)
175
215
)
@@ -206,6 +246,7 @@ object Run extends ScalaCommand[RunOptions] {
206
246
val res = maybeRun(
207
247
s,
208
248
allowTerminate = true ,
249
+ runMode = runMode(options),
209
250
showCommand = options.command,
210
251
scratchDirOpt = scratchDirOpt(options)
211
252
)
@@ -226,9 +267,10 @@ object Run extends ScalaCommand[RunOptions] {
226
267
allowExecve : Boolean ,
227
268
jvmRunner : Boolean ,
228
269
potentialMainClasses : Seq [String ],
270
+ runMode : RunMode ,
229
271
showCommand : Boolean ,
230
272
scratchDirOpt : Option [os.Path ]
231
- ): Either [BuildException , Either [Seq [String ], Process ]] = either {
273
+ ): Either [BuildException , Either [Seq [String ], ( Process , Option [() => Unit ]) ]] = either {
232
274
233
275
val mainClassOpt = build.options.mainClass.filter(_.nonEmpty) // trim it too?
234
276
.orElse {
@@ -250,6 +292,7 @@ object Run extends ScalaCommand[RunOptions] {
250
292
finalArgs,
251
293
logger,
252
294
allowExecve,
295
+ runMode,
253
296
showCommand,
254
297
scratchDirOpt
255
298
)
@@ -262,9 +305,10 @@ object Run extends ScalaCommand[RunOptions] {
262
305
args : Seq [String ],
263
306
logger : Logger ,
264
307
allowExecve : Boolean ,
308
+ runMode : RunMode ,
265
309
showCommand : Boolean ,
266
310
scratchDirOpt : Option [os.Path ]
267
- ): Either [BuildException , Either [Seq [String ], Process ]] = either {
311
+ ): Either [BuildException , Either [Seq [String ], ( Process , Option [() => Unit ]) ]] = either {
268
312
269
313
build.options.platform.value match {
270
314
case Platform .JS =>
@@ -308,7 +352,7 @@ object Run extends ScalaCommand[RunOptions] {
308
352
esModule = esModule
309
353
)
310
354
process.onExit().thenApply(_ => if (os.exists(jsDest)) os.remove(jsDest))
311
- Right (process)
355
+ Right (( process, None ) )
312
356
}
313
357
}
314
358
value(res)
@@ -327,33 +371,74 @@ object Run extends ScalaCommand[RunOptions] {
327
371
logger,
328
372
allowExecve = allowExecve
329
373
)
330
- Right (proc)
374
+ Right (( proc, None ) )
331
375
}
332
376
}
333
377
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)
378
+ runMode match {
379
+ case RunMode .Default =>
380
+ if (showCommand) {
381
+ val command = Runner .jvmCommand(
382
+ build.options.javaHome().value.javaCommand,
383
+ build.options.javaOptions.javaOpts.toSeq.map(_.value.value),
384
+ build.fullClassPath,
385
+ mainClass,
386
+ args,
387
+ useManifest = build.options.notForBloopOptions.runWithManifest,
388
+ scratchDirOpt = scratchDirOpt
389
+ )
390
+ Left (command)
391
+ }
392
+ else {
393
+ val proc = Runner .runJvm(
394
+ build.options.javaHome().value.javaCommand,
395
+ build.options.javaOptions.javaOpts.toSeq.map(_.value.value),
396
+ build.fullClassPath,
397
+ mainClass,
398
+ args,
399
+ logger,
400
+ allowExecve = allowExecve,
401
+ useManifest = build.options.notForBloopOptions.runWithManifest,
402
+ scratchDirOpt = scratchDirOpt
403
+ )
404
+ Right ((proc, None ))
405
+ }
406
+ case RunMode .SparkSubmit =>
407
+ value {
408
+ RunSpark .run(
409
+ build,
410
+ mainClass,
411
+ args,
412
+ logger,
413
+ allowExecve,
414
+ showCommand,
415
+ scratchDirOpt
416
+ )
417
+ }
418
+ case RunMode .StandaloneSparkSubmit =>
419
+ value {
420
+ RunSpark .runStandalone(
421
+ build,
422
+ mainClass,
423
+ args,
424
+ logger,
425
+ allowExecve,
426
+ showCommand,
427
+ scratchDirOpt
428
+ )
429
+ }
430
+ case RunMode .HadoopJar =>
431
+ value {
432
+ RunHadoop .run(
433
+ build,
434
+ mainClass,
435
+ args,
436
+ logger,
437
+ allowExecve,
438
+ showCommand,
439
+ scratchDirOpt
440
+ )
441
+ }
357
442
}
358
443
}
359
444
}
0 commit comments