1919package com .codelerity .core .bin ;
2020
2121import java .io .File ;
22+ import java .io .IOException ;
23+ import java .nio .file .Files ;
24+ import java .nio .file .Path ;
2225import java .util .ArrayList ;
2326import java .util .List ;
27+ import java .util .Locale ;
28+ import java .util .Map ;
2429import java .util .Optional ;
30+ import java .util .stream .Stream ;
31+ import org .praxislive .core .types .PArray ;
32+ import org .praxislive .core .types .PString ;
2533import org .praxislive .launcher .Launcher ;
2634
2735public class Main {
@@ -32,35 +40,41 @@ public static void main(String[] args) {
3240
3341 private static class LauncherCtxt implements Launcher .Context {
3442
35- private final String command ;
36- private final String modulePath ;
37- private final String classPath ;
38-
3943 private LauncherCtxt () {
40- command = ProcessHandle .current ().info ().command ().orElse ("java" );
41- modulePath = System .getProperty ("jdk.module.path" );
42- classPath = System .getProperty ("java.class.path" );
4344 }
4445
4546 @ Override
4647 public ProcessBuilder createChildProcessBuilder (List <String > javaOptions ,
4748 List <String > arguments ) {
48- List <String > cmd = new ArrayList <>();
49- cmd .add (command );
50- cmd .addAll (javaOptions );
51- if (modulePath == null || modulePath .isEmpty ()) {
52- cmd .add ("-classpath" );
53- cmd .add (classPath );
54- cmd .add ("com.codelerity.core.bin.Main" );
55- } else {
56- cmd .add ("--add-modules=ALL-DEFAULT" );
57- cmd .add ("-p" );
58- cmd .add (modulePath );
59- cmd .add ("-m" );
60- cmd .add ("com.codelerity.core.bin/com.codelerity.core.bin.Main" );
49+ boolean isWindows = System .getProperty ("os.name" , "" )
50+ .toLowerCase (Locale .ROOT ).contains ("windows" );
51+ String basedir = System .getProperty ("app.home" );
52+ if (basedir == null || basedir .isBlank ()) {
53+ throw new IllegalStateException ("Cannot find app.home" );
6154 }
55+ Path bin = Path .of (basedir , "bin" );
56+ Path launcher ;
57+ try (Stream <Path > files = Files .list (bin )) {
58+ launcher = files .filter (f -> {
59+ boolean isCmd = f .toString ().endsWith (".cmd" );
60+ return isWindows ? isCmd : !isCmd && Files .isExecutable (f );
61+ }).findFirst ()
62+ .orElseThrow (() -> new IllegalStateException ("Cannot find launcher" ));
63+
64+ } catch (IOException ex ) {
65+ throw new IllegalStateException ("Cannot find launcher" , ex );
66+ }
67+ List <String > cmd = new ArrayList <>();
68+ cmd .add (launcher .toString ());
6269 cmd .addAll (arguments );
63- return new ProcessBuilder (cmd );
70+ ProcessBuilder pb = new ProcessBuilder (cmd );
71+ Map <String , String > env = pb .environment ();
72+ env .put ("JAVA_HOME" , System .getProperty ("java.home" ));
73+ env .put ("JAVA_OPTS" , javaOptions .stream ()
74+ .map (PString ::of )
75+ .collect (PArray .collector ())
76+ .toString ());
77+ return pb ;
6478 }
6579
6680 @ Override
0 commit comments