/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 Ġd ork box , Ġl lc ĊĊ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġd ork box . executor Ċ Ċ import Ġd ork box . executor . exceptions . Invalid Exit Value Exception Ċ import Ġd ork box . executor . process Results . Sync Process Result Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent .* Ċ Ċ /** Ċ Ġ* ĠOptions Ġfor Ġconfiguring Ġa Ġprocess Ġto Ġrun Ġusing Ġthe Ġsame ĠJVM Ġas Ġthe Ġcurrently Ġlaunched Ġj vm Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠNOTE : ĠIf Ġyou Ġare Ġlaunch ing Ġusing Ġthe Ġsame Ġclasspath Ġas Ġbefore , Ġand Ġyou Ġset Ġthe Ġmain - classpath Ġto Ġbe Ġexecuted Ġas Ġa Ċ Ġ* Ġ" single Ġfile Ġsource Ġcode " Ġfile Ġvia Ġjava 1 1 +, ĠYOU ĠCAN ĠGET ĠTHE ĠFOL LOW ING ĠERROR . Ċ Ġ* Ċ Ġ* Ġ" error : Ġclass Ġfound Ġon Ġapplication Ġclass Ġpath Ġ.... Ġ" Ċ Ġ* Ċ Ġ* ĠWhat Ġthis ĠRE ALLY Ġmeans Ġis : Ċ Ġ* Ċ Ġ* Ġ" error : ĠA Ġcompiled Ġclass Ġ< fully Ġqualified Ġclass Ġname > Ġalready Ġexists Ġon Ċ Ġ* Ġthe Ġapplication Ġclasspath Ġand Ġas Ġa Ġresult Ġthe Ġsame Ġclass Ġcannot Ġbe Ġused Ċ Ġ* Ġas Ġa Ġsource Ġfor Ġlaunch ing Ġsingle - file Ġsource Ġcode Ġprogram ". Ċ Ġ* Ċ Ġ* Ġhttps :// mail . openjdk . java . net / pi per mail / jdk - dev / 2 0 1 8 - June / 0 0 1 4 3 8 . html Ċ Ġ*/ Ċ class ĠJ vm Exec Options ( private Ġval Ġexecutor : ĠExecutor , Ġprivate Ġval Ġjava Executable : ĠString ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Jvm Exec Options :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSPACE _ REGEX Ġ= Ġ" Ġ". to Regex () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġthis Ġis ĠNOT Ġrelated Ġto ĠJAVA _ HOME , Ġbut Ġis Ġinstead Ġthe Ġlocation Ġof Ġthe ĠJ RE Ġthat Ġwas Ġused Ġto Ġlaunch Ġjava Ġinitially . ĊĠĠĠ Ġinternal Ġvar Ġjava Location Ġ= ĠJ vm Helper . get Jvm Path ( Executor . IS _ OS _ MAC , ĠExecutor . IS _ OS _ WINDOWS ) ĊĠĠĠ Ġinternal Ġvar Ġmain Class : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġvar Ġinitial Heap Size In Me g aby tes Ġ= Ġ 0 ĊĠĠĠ Ġinternal Ġvar Ġmaximum Heap Size In Me g aby tes Ġ= Ġ 0 ĊĊĠĠĠ Ġinternal Ġval Ġj vm Options Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġinternal Ġval Ġclasspath Entries Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġinternal Ġval Ġmain Class Arguments Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġinternal Ġvar Ġjar File : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġvar Ġclone Classpath : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġclasspath Ġfor Ġthis ĠJAVA Ġprocess ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetClass path (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtotal Size : ĠInt Ġ= Ġclasspath Entries . size ĊĠĠĠĠĠĠĠ Ġval Ġpath Separator Ġ= ĠFile . path Separator ĊĊĠĠĠĠĠĠĠ Ġ// ĠDO ĠNOT ĠQU OTE Ġthe Ġelements Ġin Ġthe Ġclasspath ! ĊĠĠĠĠĠĠĠ Ġclasspath Entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfix Ġa Ġnast y Ġproblem Ġwhen Ġspaces Ġaren 't Ġproperly Ġescaped ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġclasspath Entry Ġ= Ġit . replace ( SPACE _ REGEX , Ġ"\\ Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġthe Ġclasspath Ġis ĠA BS OL UTE Ġpathname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Entry Ġ= ĠFile ( classpath Entry ). absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( classpath Entry ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Error Ġprocessing Ġclasspath !! ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ< Ġtotal Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( path Separator ) Ġ// Ġ; Ġon Ġwindows , Ġ: Ġon Ġlinux ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġspecified , Ġcopy Ġthe Ġcurrent ĠJVM Ġprocess Ġsettings Ġto Ġthe Ġnew Ġprocess ĊĠĠĠĠĠĠĠ Ġif Ġ( clone Classpath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclasspath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Classpath Ġ= ĠSystem . getProperty (" java . class . path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( additional Classpath . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġto Ġadd Ġa Ġseparator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( path Separator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( additional Classpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe ĠJVM Ġinitial Ġheap Ġsize , Ġin Ġmeg aby tes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Initial Heap Size In Me g aby tes ( initial Heap Size In Me g aby tes : ĠInt ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . initial Heap Size In Me g aby tes Ġ= Ġinitial Heap Size In Me g aby tes ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe ĠJVM Ġmaximum Ġheap Ġsize , Ġin Ġmeg aby tes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Maximum Heap Size In Me g aby tes ( maximum Heap Size In Me g aby tes : ĠInt ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . maximum Heap Size In Me g aby tes Ġ= Ġmaximum Heap Size In Me g aby tes ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCop ies Ġthe Ġoriginal ĠJVM Ġclasspath Ġin Ġthis Ġnewly Ġcreated ĠJVM . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠIf Ġyou Ġare Ġlaunch ing Ġusing Ġthe Ġsame Ġclasspath Ġas Ġbefore , Ġand Ġyou Ġset Ġthe Ġmain - classpath Ġto Ġbe Ġexecuted Ġas Ġa ĊĠĠĠĠ Ġ* Ġ" single Ġfile Ġsource Ġcode " Ġfile Ġvia Ġjava 1 1 +, ĠYOU ĠCAN ĠGET ĠTHE ĠFOL LOW ING ĠERROR . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ" error : Ġclass Ġfound Ġon Ġapplication Ġclass Ġpath Ġ.... Ġ" ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhat Ġthis ĠRE ALLY Ġmeans Ġis : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ" error : ĠA Ġcompiled Ġclass Ġ< fully Ġqualified Ġclass Ġname > Ġalready Ġexists Ġon ĊĠĠĠĠ Ġ* Ġthe Ġapplication Ġclasspath Ġand Ġas Ġa Ġresult Ġthe Ġsame Ġclass Ġcannot Ġbe Ġused ĊĠĠĠĠ Ġ* Ġas Ġa Ġsource Ġfor Ġlaunch ing Ġsingle - file Ġsource Ġcode Ġprogram ". ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġhttps :// mail . openjdk . java . net / pi per mail / jdk - dev / 2 0 1 8 - June / 0 0 1 4 3 8 . html ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclone Classpath (): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . clone Classpath Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġmain Ġclass Ġto Ġlaunch Ġ( optional , Ġas Ġa ĠJ AR Ġcan Ġhave Ġthis Ġin Ġthe Ġmanifest ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠIf Ġyou Ġare Ġlaunch ing Ġusing Ġthe Ġsame Ġclasspath Ġas Ġbefore , Ġand Ġyou Ġset Ġthe Ġmain - classpath Ġto Ġbe Ġexecuted Ġas Ġa ĊĠĠĠĠ Ġ* Ġ" single Ġfile Ġsource Ġcode " Ġfile Ġvia Ġjava 1 1 +, ĠYOU ĠCAN ĠGET ĠTHE ĠFOL LOW ING ĠERROR . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ" error : Ġclass Ġfound Ġon Ġapplication Ġclass Ġpath Ġ.... Ġ" ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhat Ġthis ĠRE ALLY Ġmeans Ġis : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ" error : ĠA Ġcompiled Ġclass Ġ< fully Ġqualified Ġclass Ġname > Ġalready Ġexists Ġon ĊĠĠĠĠ Ġ* Ġthe Ġapplication Ġclasspath Ġand Ġas Ġa Ġresult Ġthe Ġsame Ġclass Ġcannot Ġbe Ġused ĊĠĠĠĠ Ġ* Ġas Ġa Ġsource Ġfor Ġlaunch ing Ġsingle - file Ġsource Ġcode Ġprogram ". ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġhttps :// mail . openjdk . java . net / pi per mail / jdk - dev / 2 0 1 8 - June / 0 0 1 4 3 8 . html ĊĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Main Class ( main Class : ĠString ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġto Ġnormalize Ġthe Ġmain Ġclass Ġpath . ĊĠĠĠĠĠĠĠ Ġthis . main Class Ġ= Ġmain Class ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd ĠJVM Ġclasspath . ĠThis Ġcannot Ġbe Ġcombined Ġwith Ġa ĠJ AR Ġentry . ĠThey Ġare Ġmut ually Ġexclusive ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Jvm Classpath ( var arg Ġclasspath : ĠString ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġclasspath . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Entries . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd ĠJVM Ġoptions Ġfor Ġthe Ġlaunched Ġprocess ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Jvm Option ( var arg Ġarguments : ĠString ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġarguments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Options . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthe ĠJ AR Ġfile Ġto Ġuse . ĠThis Ġcannot Ġbe Ġcombined Ġwith Ġa ĠJVM Ġclasspath . ĠThey Ġare Ġmut ually Ġexclusive ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Jar File ( jar File : ĠString ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . jar File Ġ= Ġjar File ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthe ĠJAVA Ġexecutable Ġto Ġlaunch Ġthis Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBy Ġdefault , Ġthis Ġwill Ġuse Ġthe Ġsame Ġjava Ġexecutable Ġas Ġwas Ġused Ġto Ġstart Ġthe Ġcurrent ĠJVM . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Java ( java Location : ĠString ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . java Location Ġ= ĠFile ( java Location ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthe ĠJAVA Ġexecutable Ġto Ġlaunch Ġthis Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBy Ġdefault , Ġthis Ġwill Ġuse Ġthe Ġsame Ġjava Ġexecutable Ġas Ġwas Ġused Ġto Ġstart Ġthe Ġcurrent ĠJVM . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Java ( java Location : ĠFile ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . java Location Ġ= Ġjava Location ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġarguments Ġto Ġan Ġexisting Ġcommand , Ġwhich Ġwill Ġbe Ġexecuted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġdoes Ġnot Ġreplace Ġcommands , Ġit Ġadds Ġto Ġthem ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġarguments ĠA Ġstring Ġarray Ġcontaining Ġthe Ġprogram Ġand / or Ġits Ġarguments . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThis Ġprocess Ġexecutor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Arg ( var arg Ġarguments : ĠString ): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixed Ġ= ĠExecutor . fix Arguments ( listOf (* arguments )) ĊĠĠĠĠĠĠĠ Ġmain Class Arguments . addAll ( fixed ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġarguments Ġto Ġan Ġexisting Ġcommand , Ġwhich Ġwill Ġbe Ġexecuted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġdoes Ġnot Ġreplace Ġcommands , Ġit Ġadds Ġto Ġthem ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġarguments ĠA Ġstring Ġarray Ġcontaining Ġthe Ġprogram Ġand / or Ġits Ġarguments . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThis Ġprocess Ġexecutor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Arg ( arguments : ĠIterable < String >): ĠJ vm Exec Options Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixed Ġ= ĠExecutor . fix Arguments ( arguments ) ĊĠĠĠĠĠĠĠ Ġmain Class Arguments . addAll ( fixed ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġthe ĠJAVA Ġsub Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwaits Ġuntil Ġthe Ġprocess Ġexits , Ġa Ġtimeout Ġoccurs Ġor Ġthe Ġcaller Ġthread Ġgets Ġinterrupted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġthe Ġlatter Ġcases Ġthe Ġprocess Ġgets Ġdestroyed Ġas Ġwell . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout ĠIf Ġspecified Ġ( non - zero ), Ġthen Ġif Ġthe Ġprocess Ġis Ġrunning Ġlonger Ġthan Ġthis ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecified Ġinterval , Ġa Ġ[ TimeoutException ] Ġis Ġthrown Ġand Ġthe Ġprocess Ġis Ġdestroyed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġexit Ġcode Ġof Ġthe Ġfinished Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġan Ġerror Ġoccurred Ġwhen Ġprocess Ġwas Ġstarted Ġor Ġstopped . ĊĠĠĠĠ Ġ* Ġ@ throws ĠInterruptedException Ġthis Ġthread Ġwas Ġinterrupted . ĊĠĠĠĠ Ġ* Ġ@ throws ĠTimeout Exception Ġtimeout Ġset Ġby Ġ[. timeout ] Ġwas Ġreached . ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid Exit Value Exception Ġif Ġinvalid Ġexit Ġvalue Ġwas Ġreturned Ġ(@ see Ġ[. exit Values ]). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class , ĠTimeout Exception :: class , ĠInvalid Exit Value Exception :: class ) ĊĠĠĠ Ġsuspend Ġfun Ġstart ( timeout : ĠLong Ġ= Ġ 0 , Ġtimeout Unit : ĠTimeUnit Ġ= ĠTimeUnit . SECONDS ): ĠSync Process Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecutor . start ( timeout , Ġtimeout Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġthe Ġsub Ġprocess Ġin Ġa Ġnew Ġcoroutine . ĠThe Ġcalling Ġthread Ġwill Ġcontinue Ġexecution . ĠThis Ġmethod Ġdoes Ġnot Ġwait Ġuntil Ġthe Ġprocess Ġexits . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCalling Ġ[ Sync Process Result . output ] Ġwill Ġresult Ġin Ġa Ġblocking Ġread Ġof Ġprocess Ġoutput . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġpassed Ġto Ġ[. timeout ] Ġis Ġignored . ĠUse Ġ[ Deferred Process Result . await ] Ġto Ġwait Ġfor Ġthe Ġprocess Ġto Ġfinish . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠInvoke Ġ[ Deferred Process Result . cancel ] Ġto Ġdestroy Ġthe Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout ĠIf Ġspecified Ġ( non - zero ), Ġthen Ġif Ġthe Ġprocess Ġis Ġrunning Ġlonger Ġthan Ġthis ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecified Ġinterval , Ġa Ġ[ TimeoutException ] Ġis Ġthrown Ġand Ġthe Ġprocess Ġis Ġdestroyed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Deferred Process Result ] Ġrepresenting Ġthe Ġprocess Ġresults Ġ( value / completed Ġoutput streams / etc ) Ġof Ġthe Ġfinished Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġan Ġerror Ġoccurred Ġwhen Ġprocess Ġwas Ġstarted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġstart Async ( timeout : ĠLong Ġ= Ġ 0 , Ġtimeout Unit : ĠTimeUnit Ġ= ĠTimeUnit . SECONDS ): ĠDeferred Process Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecutor . start Async ( timeout , Ġtimeout Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcalling Ġthread Ġwill Ġimmediately Ġexecute Ġthe Ġsub Ġprocess . ĠWhen Ġtrying Ġto Ġclose Ġthe Ġinput Ġstreams , Ġthe Ġcol ling Ġthread Ġmay Ġblock . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠW aits Ġuntil : ĊĠĠĠĠ Ġ* Ġ Ġ- Ġthe Ġprocess Ġstops ĊĠĠĠĠ Ġ* Ġ Ġ- Ġa Ġtimeout Ġoccurs Ġand Ġthe Ġcaller Ġthread Ġgets Ġinterrupted . Ġ( In Ġthis Ġcase Ġthe Ġprocess Ġgets Ġdestroyed Ġas Ġwell .) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCalling Ġ[ Sync Process Result . output ] Ġwill Ġresult Ġin Ġa Ġnon - blocking Ġread Ġof Ġprocess Ġoutput . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout ĠIf Ġspecified Ġ( non - zero ), Ġthen Ġif Ġthe Ġprocess Ġis Ġrunning Ġlonger Ġthan Ġthis ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecified Ġinterval , Ġa Ġ[ TimeoutException ] Ġis Ġthrown Ġand Ġthe Ġprocess Ġis Ġdestroyed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġresults Ġof Ġthe Ġfinished Ġprocess Ġ( exit Ġcode Ġand Ġoutput , Ġif Ġany ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġan Ġerror Ġoccurred Ġwhen Ġprocess Ġwas Ġstarted Ġor Ġstopped . ĊĠĠĠĠ Ġ* Ġ@ throws ĠInterruptedException Ġthis Ġthread Ġwas Ġinterrupted . ĊĠĠĠĠ Ġ* Ġ@ throws ĠTimeout Exception Ġtimeout Ġset Ġby Ġ[. timeout ] Ġwas Ġreached . ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid Exit Value Exception Ġif Ġinvalid Ġexit Ġvalue Ġwas Ġreturned Ġ(@ see Ġ[. exit Values ]). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class , ĠTimeout Exception :: class , ĠInvalid Exit Value Exception :: class ) ĊĠĠĠ Ġfun Ġstart Blocking ( timeout : ĠLong Ġ= Ġ 0 , Ġtimeout Unit : ĠTimeUnit Ġ= ĠTimeUnit . SECONDS ): ĠSync Process Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart ( timeout , Ġtimeout Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconfigure () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsave Ġoff Ġthe Ġoriginal Ġarguments ĊĠĠĠĠĠĠĠ Ġval Ġcommand Line Args Ġ= Ġexecutor . builder . command () ĊĠĠĠĠĠĠĠ Ġval Ġnew Args Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( java Executable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ( java Executable ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ( java Location . canonical File . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsetup Ġheap Ġinformation ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Heap Size In Me g aby tes Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ("- X ms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ("${ initial Heap Size In Me g aby tes } M ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( maximum Heap Size In Me g aby tes Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ("- X mx ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ("${ maximum Heap Size In Me g aby tes } M ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe ĠJVM Ġoptions Ġif Ġspecified ĊĠĠĠĠĠĠĠ Ġif Ġ( jvm Options . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . addAll ( Executor . fix Arguments ( jvm Options )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġadd Ġthe Ġoriginal Ġarguments ĊĠĠĠĠĠĠĠ Ġnew Args . addAll ( command Line Args ) ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġclasspath , Ġwhich Ġis Ġthe Ġsame Ġas Ġusing Ġ- cp ĊĠĠĠĠĠĠĠ Ġval Ġclasspath : ĠString Ġ= ĠgetClass path () ĊĊĠĠĠĠĠĠĠ Ġ// Ġtwo Ġversions . ĠJ AR Ġvs ĠCL AS SES Ġ( classes Ġare Ġ" raw ", Ġand Ġread Ġdirectly Ġfrom Ġdisk ) ĊĠĠĠĠĠĠĠ Ġ// ĠJ AR Ġhas Ġprecedence ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar File Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ("- jar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ( jar File !! ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠYou ĠCAN NOT Ġhave Ġa Ġclasspath Ġspecified Ġon Ġthe Ġcommand line Ġwhen Ġusing ĠJ AR s !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġmust Ġbe Ġset Ġin Ġthe Ġjar 's ĠMAN IFEST . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( classpath . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" W HO OPS . Ġ ĠYou ĠCAN NOT Ġhave Ġa Ġclasspath Ġspecified Ġon Ġthe Ġcommand line Ġwhen Ġusing ĠJ AR s , Ġit Ġmust Ġbe Ġset Ġin Ġthe ĠJ AR s ĠMAN IFEST Ġinstead ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Class Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( classpath . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ("-- class - path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ( classpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmain Ġclass Ġmust Ġhappen ĠAFTER Ġthe Ġclasspath ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . add ( main Class !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" You Ġmust Ġspecify Ġa Ġjar Ġor Ġmain Ġclass Ġwhen Ġrunning Ġa Ġjava Ġprocess !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġarguments Ġfor Ġthe Ġjava Ġprocess Ġmain - class ĊĠĠĠĠĠĠĠ Ġif Ġ( main Class Arguments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args . addAll ( Executor . fix Arguments ( main Class Arguments )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġthe Ġarguments Ġ( this Ġover writes Ġwhatever Ġis Ġalready Ġthere ) ĊĠĠĠĠĠĠĠ Ġexecutor . builder . command ( new Args ) ĊĠĠĠ Ġ} Ċ } Ċ