99use php \lib \fs ;
1010use php \lib \str ;
1111use php \util \Flow ;
12+ use Tasks ;
13+ use function var_dump ;
1214
1315class AppPluginJavaRuntimeBuilder
1416{
@@ -19,13 +21,34 @@ class AppPluginJavaRuntimeBuilder
1921
2022 public $ jvmModules = [];
2123
24+ protected $ javaHome ;
25+ protected $ javaHomeEmbedded ;
26+
2227 public function __construct ()
2328 {
29+ $ this ->javaHome = fs::parent (fs::parent ((new JavaExec ())->getJavaBin ()));
30+ $ this ->javaHomeEmbedded = $ this ->javaHome ;
31+ }
32+
33+ /**
34+ * @param string $javaHomeEmbedded
35+ */
36+ public function setJavaHomeEmbedded (string $ javaHomeEmbedded ): void
37+ {
38+ $ this ->javaHomeEmbedded = $ javaHomeEmbedded ;
39+ }
40+
41+ /**
42+ * @param string $javaHome
43+ */
44+ public function setJavaHome (string $ javaHome ): void
45+ {
46+ $ this ->javaHome = $ javaHome ;
2447 }
2548
2649 public function addJar ($ jar )
2750 {
28- $ this ->jars [$ jar ] = $ jar ;
51+ $ this ->jars [$ jar ] = fs:: abs ( $ jar) ;
2952 }
3053
3154 public function addJvmModules (...$ modules )
@@ -41,7 +64,7 @@ public function addJvmModules(...$modules)
4164 public function fetchModules ($ workingDir )
4265 {
4366 $ javaExec = new JavaExec ();
44- $ jdepsBin = fs:: parent ( $ javaExec -> getJavaBin ()) . "/jdeps " ;
67+ $ jdepsBin = $ this -> javaHome . "/bin /jdeps " ;
4568
4669 $ modules = [];
4770
@@ -69,20 +92,18 @@ public function fetchModules($workingDir)
6992 return $ modules ;
7093 }
7194
72- public function build ($ workingDir )
95+ public function buildForJDK11 ($ workingDir )
7396 {
7497 $ modules = flow (
7598 $ this ->fetchModules ($ workingDir ),
7699 $ this ->jvmModules
77100 )->toMap ();
78101
79- $ javaExec = new JavaExec ();
80- $ javaHome = fs::parent ($ javaExec ->getJavaBin ());
81- $ jlinkBin = $ javaHome . "/jlink " ;
102+ $ jlinkBin = $ this ->javaHome . "/bin/jlink " ;
82103
83104 $ proc = new Process ([
84105 $ jlinkBin ,
85- "--module-path " , "$ javaHome /jmods;out " ,
106+ "--module-path " , "$ this -> javaHomeEmbedded /jmods;out " ,
86107 "--add-modules " , str::join ($ modules , ", " ),
87108 "--output " , "jre "
88109 ], $ workingDir , System::getEnv ());
@@ -92,4 +113,28 @@ public function build($workingDir)
92113 exit (-1 );
93114 }
94115 }
116+
117+ public function buildForJDK8 ($ workingDir )
118+ {
119+ Tasks::copy ("$ this ->javaHomeEmbedded /jre " , "$ workingDir/jre " );
120+ }
121+
122+ public function build ($ workingDir )
123+ {
124+ if (fs::exists ("$ this ->javaHomeEmbedded /jmods " )) {
125+ if (!fs::exists ("$ this ->javaHome /jmods " )) {
126+ Console::error ("Failed to build jre, it's requires JDK 11+ with 'jlink' tool, JAVA_HOME = {0} " , $ this ->javaHome );
127+ exit (-1 );
128+ }
129+
130+ $ this ->buildForJDK11 ($ workingDir );
131+ } else {
132+ if (fs::exists ("$ this ->javaHomeEmbedded /jre " )) {
133+ $ this ->buildForJDK8 ($ workingDir );
134+ } else {
135+ Console::error ("Failed to build jre, cannot find {0} " , $ this ->javaHomeEmbedded );
136+ exit (-1 );
137+ }
138+ }
139+ }
95140}
0 commit comments