changeset 1518:832b96209576

Rewritten bat launcher and introduced file to keep modular JDK swithces * .Makefile: introduced MODULARJDK_ARGS_FILE=itw-modularjdk.args; built to launcher-build, handled as separate file. MODULARJDK_ARGS_LOCATION is sedded into shell scripts. bat files are now cleaned to windows line-endings. * acinclude.m4: Introduced new switch to allow to set switch file target location * configure.ac: IT_CHECK_MODULARJDK_ARGS called; fixed few typos (mostly lunch->launch) * itw-modularjdk.args: new file, containing jisgsaw argument to allow ITW to run on jdk9 and up * launcher/launchers.bat.in: rewritten from scratch; to be more like linux shell launcher * launcher/launchers.sh.in: JAVA no longer sed. USed JRE/bin/java instead. Adapted for itw-modularjdk.args file; few additional cosmetic changes
author Jiri Vanek <jvanek@redhat.com>
date Mon, 25 Feb 2019 14:45:23 +0100
parents 970c439b2553
children 72920cd7c6cc
files ChangeLog Makefile.am acinclude.m4 configure.ac itw-modularjdk.args launcher/launchers.bat.in launcher/launchers.sh.in
diffstat 7 files changed, 315 insertions(+), 184 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Feb 25 14:00:34 2019 +0100
+++ b/ChangeLog	Mon Feb 25 14:45:23 2019 +0100
@@ -1,3 +1,16 @@
+2019-02-11  Laurent Bourgès <bourges.laurent@gmail.com>
+            Jiri Vanek <jvanek@redhat.com>
+
+	Rewritten bat launcher and introduced file to keep modular JDK swithces
+	* .Makefile: introduced MODULARJDK_ARGS_FILE=itw-modularjdk.args; built to launcher-build, handled as separate file.
+	MODULARJDK_ARGS_LOCATION is sedded into shell scripts. bat files are now cleaned to windows line-endings.
+	* acinclude.m4: Introduced new switch to allow to set switch file target location
+	* configure.ac: IT_CHECK_MODULARJDK_ARGS called; fixed few typos (mostly lunch->launch)
+	* itw-modularjdk.args: new file, containing jisgsaw argument to allow ITW to run on jdk9 and up
+	* launcher/launchers.bat.in: rewritten from scratch; to be more like linux shell launcher
+	* launcher/launchers.sh.in: JAVA no longer sed. USed JRE/bin/java instead. Adapted for itw-modularjdk.args file;
+	few additional cosmetic changes
+
 2019-02-07  Jiri Vanek <jvanek@redhat.com>
 
 	Allowed cross-build of bat launchers on linux systems
--- a/Makefile.am	Mon Feb 25 14:00:34 2019 +0100
+++ b/Makefile.am	Mon Feb 25 14:45:23 2019 +0100
@@ -28,6 +28,9 @@
 	WIN_LAUNCHERS=
 endif
 
+
+MODULARJDK_ARGS_FILE=itw-modularjdk.args
+
 if WINDOWS_OR_INCLUDE_BATS
 	WIN_LAUNCHERS=launcher.build/$(javaws).bat launcher.build/$(itweb_settings).bat  launcher.build/$(policyeditor).bat
 else
@@ -35,17 +38,17 @@
 endif
 
 if ENABLE_SHELL_LAUNCHERS
-	SHELL_LUNCHERS=$(WIN_LAUNCHERS) launcher.build/$(javaws).sh launcher.build/$(itweb_settings).sh launcher.build/$(policyeditor).sh
+	SHELL_LAUNCHERS=$(WIN_LAUNCHERS) launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws).sh launcher.build/$(itweb_settings).sh launcher.build/$(policyeditor).sh
 else
-	SHELL_LUNCHERS=
+	SHELL_LAUNCHERS=
 endif
 
 
 if ENABLE_NATIVE_LAUNCHERS
-	NATIVE_LUNCHERS=launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor)
+	NATIVE_LAUNCHERS=launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor)
 	DESKTOP_SUFFIX=
 else
-	NATIVE_LUNCHERS=
+	NATIVE_LAUNCHERS=
 	DESKTOP_SUFFIX=.sh
 endif
 
@@ -55,7 +58,7 @@
 ITWEB_SETTINGS=$(itweb_settings)$(DESKTOP_SUFFIX)
 POLICYEDITOR=$(policyeditor)$(DESKTOP_SUFFIX)
 
-LAUNCHERS=$(NATIVE_LUNCHERS) $(SHELL_LUNCHERS)
+LAUNCHERS=$(NATIVE_LAUNCHERS) $(SHELL_LAUNCHERS)
 DESKTOP_FILES=javaws.desktop itweb-settings.desktop policyeditor.desktop
 DESKTOP_IN_FILES=javaws.desktop.in itweb-settings.desktop.in policyeditor.desktop.in
 
@@ -168,8 +171,11 @@
   PLUGIN_JAR=$(datadir)/$(PACKAGE_NAME)/plugin.jar
   JSOBJECT_JAR=$(datadir)/$(PACKAGE_NAME)/jsobject.jar
 endif
-  NETX_JAR=$(datadir)/$(PACKAGE_NAME)/netx.jar
-  SPLASH_PNG=$(datadir)/$(PACKAGE_NAME)/javaws_splash.png
+
+NETX_JAR=$(datadir)/$(PACKAGE_NAME)/netx.jar
+SPLASH_PNG=$(datadir)/$(PACKAGE_NAME)/javaws_splash.png
+MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_DIR)/$(MODULARJDK_ARGS_FILE)
+
 
 # Conditional defintions
 if HAVE_TAGSOUP
@@ -301,7 +307,7 @@
 
 export PLUGIN_VERSION = IcedTea-Web $(FULL_VERSION)
 
-export EXTRA_DIST = $(top_srcdir)/netx $(top_srcdir)/plugin javaws.png $(DESKTOP_IN_FILES) $(top_srcdir)/completion \
+export EXTRA_DIST = $(MODULARJDK_ARGS_FILE) $(top_srcdir)/netx $(top_srcdir)/plugin javaws.png $(DESKTOP_IN_FILES) $(top_srcdir)/completion \
  launcher $(top_srcdir)/tests html-gen.sh NEW_LINE_IFS $(top_srcdir)/metadata.in $(top_srcdir)/win-installer
 
 # reproducers `D`shortcuts
@@ -324,6 +330,14 @@
 itweb_settings:= $(shell echo itweb-settings | sed '@program_transform_name@')
 policyeditor:= $(shell echo policyeditor | sed '@program_transform_name@')
 
+if WINDOWS_OR_INCLUDE_BATS
+# convert Unix newlines (LF) to DOS format:
+  fix_CRLF=-e "s/\$$/\r/"
+else
+  fix_CRLF=
+endif
+
+
 # the launcher needs to know $(bindir) and $(datadir) which can be different at
 # make-time from configure-time
 edit_launcher_script = sed \
@@ -339,7 +353,9 @@
   -e "s|[@]MSLINKS_JAR[@]|$(MSLINKS_JAR)|g" \
   -e "s|[@]TAGSOUP_JAR[@]|$(TAGSOUP_JAR)|g" \
   -e "s|[@]RHINO_JAR[@]|$(RHINO_JAR)|g" \
-  -e "s|[@]PROGRAM_NAME[@]|$${PROGRAM_NAME}|g"
+  -e "s|[@]PROGRAM_NAME[@]|$${PROGRAM_NAME}|g" \
+  -e "s|[@]MODULARJDK_ARGS_LOCATION[@]|$(MODULARJDK_ARGS_LOCATION)|g"
+
 
 # Top-Level Targets
 # =================
@@ -373,6 +389,8 @@
 	${INSTALL_DATA} $(NETX_DIR)/lib/classes.jar $(DESTDIR)$(NETX_JAR)
 	${INSTALL_DATA} $(NETX_SRCDIR)/javaws_splash.png $(DESTDIR)$(SPLASH_PNG)
 	${INSTALL_DATA} $(TOP_SRC_DIR)/javaws.png $(ICONS_DEST_DIR)/
+	mkdir -p $(MODULARJDK_ARGS_DIR)
+	${INSTALL_PROGRAM} launcher.build/$(MODULARJDK_ARGS_FILE) $(MODULARJDK_ARGS_DIR)/$(MODULARJDK_ARGS)
 if ENABLE_NATIVE_LAUNCHERS
 	${INSTALL_PROGRAM} launcher.build/$(javaws) $(DESTDIR)$(bindir)
 	${INSTALL_PROGRAM} launcher.build/$(itweb_settings) $(DESTDIR)$(bindir)
@@ -460,6 +478,7 @@
 if ENABLE_DOCS
 	cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs
 endif
+	if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi
 	(cd $(DESTDIR)$(prefix)/.. && $(ZIP) -qr $(TOP_BUILD_DIR)/$(distdir).linux.bin.zip `basename $(DESTDIR)$(prefix)` );
 
 win-bin-dist: win-only-image
@@ -469,6 +488,7 @@
 # strips cygwin and other linux-like blobs. keeping only windows-usefull stuff
 win-only-image: install uninstall-linux-only remove-empty-linux-only-dirs
 	rm -rf $(WIN_ALL_DEPS)
+	if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi
 if ENABLE_DOCS
 	cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs
 endif
@@ -513,7 +533,7 @@
 	if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ;
 
 # all generated manpages must be removed one by one
-# shell (only shell!) lunchers must go away
+# shell (only shell!) launchers must go away
 uninstall-linux-only:
 	KNOWN_MANS="icedtea-web.1  icedtea-web-plugin.1  itweb-settings.1  javaws.1  policyeditor.1" ; \
 	KNOWN_DIRS="man1 de/man1 pl/man1 cs/man1" ; \
@@ -911,6 +931,12 @@
 	rm -f itweb-settings.desktop
 	rm -f policyeditor.desktop
 
+# launcher run args:
+launcher.build/$(MODULARJDK_ARGS_FILE): $(srcdir)/$(MODULARJDK_ARGS_FILE)
+	mkdir -p launcher.build
+	cp $(srcdir)/$(MODULARJDK_ARGS_FILE) launcher.build/$(MODULARJDK_ARGS_FILE)
+
+
 if ENABLE_SHELL_LAUNCHERS
 launcher.build/$(javaws).sh: launcher/launchers.sh.in
 	mkdir -p launcher.build
@@ -940,8 +966,7 @@
 	MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ;\
 	BIN_LOCATION=$(bindir)/$(javaws) ;\
 	PROGRAM_NAME=$(javaws) ;\
-	$(edit_launcher_script) < $< > $@
-
+	$(edit_launcher_script) $(fix_CRLF) < $< > $@
 
 # TODO get rid of this copypaste
 launcher.build/$(itweb_settings).bat: launcher/launchers.bat.in
@@ -949,7 +974,7 @@
 	MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ;\
 	BIN_LOCATION=$(bindir)/$(itweb_settings) ;\
 	PROGRAM_NAME=$(itweb_settings) ;\
-	$(edit_launcher_script) < $< > $@
+	$(edit_launcher_script) $(fix_CRLF) < $< > $@
 
 # TODO get rid of this copypaste
 launcher.build/$(policyeditor).bat: launcher/launchers.bat.in
@@ -957,11 +982,12 @@
 	MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ;\
 	BIN_LOCATION=$(bindir)/$(policyeditor) ;\
 	PROGRAM_NAME=$(policyeditor) ;\
-	$(edit_launcher_script) < $< > $@
+	$(edit_launcher_script) $(fix_CRLF) < $< > $@
 endif
 endif
 
 clean-launchers:
+	rm -f launcher.build/$(MODULARJDK_ARGS_FILE)
 if ENABLE_NATIVE_LAUNCHERS
 	rm -f launcher.build/$(javaws)
 	rm -f launcher.build/$(itweb_settings)
@@ -972,12 +998,12 @@
 	rm -f launcher.build/$(javaws).sh
 	rm -f launcher.build/$(itweb_settings).sh
 	rm -f launcher.build/$(policyeditor).sh
-if WINDOWS
+endif
+if WINDOWS_OR_INCLUDE_BATS
 	rm -f launcher.build/$(javaws).bat
 	rm -f launcher.build/$(itweb_settings).bat
 	rm -f launcher.build/$(policyeditor).bat
 endif
-endif
 	if [ -e launcher.build ] ; then \
 	  rmdir launcher.build ; \
 	fi
--- a/acinclude.m4	Mon Feb 25 14:00:34 2019 +0100
+++ b/acinclude.m4	Mon Feb 25 14:45:23 2019 +0100
@@ -1163,3 +1163,18 @@
     AC_SUBST(WIX_TOOLSET_DIR)
   fi
 ])
+
+AC_DEFUN([IT_CHECK_MODULARJDK_ARGS],
+[
+  AC_MSG_CHECKING([where to place file with modular switches])
+  AC_ARG_WITH([modularjdk-file],
+	      [AS_HELP_STRING(--with-modularjdk-file,directory where file with arguments for modualr jdk willbe installed)],
+  [
+    MODULARJDK_ARGS_DIR="${withval}"
+  ],
+  [ 
+    MODULARJDK_ARGS_DIR="${bindir}"
+  ])
+  AC_MSG_RESULT([${MODULARJDK_ARGS_DIR}])
+  AC_SUBST([MODULARJDK_ARGS_DIR])
+])
--- a/configure.ac	Mon Feb 25 14:00:34 2019 +0100
+++ b/configure.ac	Mon Feb 25 14:45:23 2019 +0100
@@ -64,7 +64,7 @@
 AC_MSG_CHECKING([whether to include also bat lunchers during linux build])
 AC_ARG_ENABLE([bats-on-linux],
 	      [AS_HELP_STRING([--enable-bats-on-linux],
-	      		      [enable generation of windows legacy bat launchers during linux build with legacy shell launchers. This is for subjects, who wish to do an custom build for windows and linuxes/mac users togethrer. Preparation of rest of the ITW then require a bit of love. This switch is not exactly supported option.])],
+	      		      [enable generation of windows legacy bat launchers during linux build with legacy shell launchers. This is for subjects, who wish to do an custom build for windows and linuxes/mac users together. Preparation of rest of the ITW then require a bit of love. This switch is not exactly supported option.])],
 	      [WINDOWS_OR_INCLUDE_BATS="${enableval}"], [WINDOWS_OR_INCLUDE_BATS='no'])
 AM_CONDITIONAL([WINDOWS_OR_INCLUDE_BATS], [test "x$WINDOWS_OR_INCLUDE_BATS" = "xyes" -o "$build_windows" = "yes" ])
 AC_MSG_RESULT(${WINDOWS_OR_INCLUDE_BATS})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/itw-modularjdk.args	Mon Feb 25 14:45:23 2019 +0100
@@ -0,0 +1,27 @@
+# -------------------------------------
+# IcedTea-Web jigsaw run args (jdk9+)
+# -------------------------------------
+
+--add-reads=java.base=ALL-UNNAMED,java.desktop
+--add-reads=java.desktop=ALL-UNNAMED,java.naming
+--add-reads=java.naming=ALL-UNNAMED,java.desktop
+
+--add-exports=java.desktop/sun.awt=ALL-UNNAMED,java.desktop
+--add-exports=java.desktop/javax.jnlp=ALL-UNNAMED,java.desktop
+
+--add-exports=java.base/com.sun.net.ssl.internal.ssl=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.security.action=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.security.provider=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.security.util=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.security.validator=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.security.x509=ALL-UNNAMED,java.desktop
+--add-exports=java.base/jdk.internal.util.jar=ALL-UNNAMED,java.desktop
+--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED,java.desktop
+
+--add-exports=java.desktop/sun.awt.X11=ALL-UNNAMED,java.desktop
+--add-exports=java.desktop/sun.applet=ALL-UNNAMED,java.desktop
+--add-exports=java.desktop/sun.applet=ALL-UNNAMED,jdk.jsobject
+
+--add-exports=java.naming/com.sun.jndi.toolkit.url=ALL-UNNAMED,java.desktop
+
--- a/launcher/launchers.bat.in	Mon Feb 25 14:00:34 2019 +0100
+++ b/launcher/launchers.bat.in	Mon Feb 25 14:45:23 2019 +0100
@@ -1,89 +1,188 @@
+@echo off
+setLocal EnableDelayedExpansion
+
 rem use JAVAWS_J_OPTIONS to pass java arguments, instead of -J opts for this script. This will be fixed in next releases
-rem use ITW_HOME to set location where ITW can be found. Form there all binaries and jars and other resources are found
+rem use ITW_HOME to set location where ITW can be found. From there all binaries and jars and other resources are found
 rem use JAVA_HOME to set path to JRE
 rem any redistribution/installer can replace INST_ITW_HOME and INST_JAVA_HOME to create better defaults
 rem if not set, following defaults are used
-set CLASSNAME=@MAIN_CLASS@
-set PROGRAM_NAME=@PROGRAM_NAME@
+set "INST_ITW_HOME="
+set "INST_JAVA_HOME="
+
+rem Warning for linux users: when you put VAR="value" also quotes are stored in VAR!
+rem maybe set "VAR=value" is working better?
+rem Warning for if blocks: variables using %my_var% do not work (interpreter), use !my_var! with ENABLEDELAYEDEXPANSION instead
+rem convention to use for temporary variables use '_' prefix
+
+set "NASHORN=lib/ext/nashorn.jar"
+set "JRE=@JRE@"
+set "JAVA=%JRE%/bin/java"
+set "LAUNCHER_BOOTCLASSPATH=@LAUNCHER_BOOTCLASSPATH@"
+set "LAUNCHER_FLAGS=-Xms8m"
+set "CLASSNAME=@MAIN_CLASS@"
+set "BINARY_LOCATION=@BIN_LOCATION@.bat"
+set "SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@"
+set "RUN_ARGS_LOCATION=@MODULARJDK_ARGS_LOCATION@"
+set "PROGRAM_NAME=@PROGRAM_NAME@"
+set "CP=%JRE%/lib/rt.jar;%JRE%/lib/jfxrt.jar"
+
+rem individual parts of bootclasspath for more easy processing
+set "NETX_JAR=@NETX_JAR@"
+set "PLUGIN_JAR=@PLUGIN_JAR@"
+set "JSOBJECT_JAR=@JSOBJECT_JAR@"
+set "TAGSOUP_JAR=@TAGSOUP_JAR@"
+set "RHINO_JAR=@RHINO_JAR@"
+set "MSLINKS_JAR=@MSLINKS_JAR@"
+
 
-# individual parts of bootclasspath for more easy processing
-NETX_JAR=@NETX_JAR
-PLUGIN_JAR=@PLUGIN_JAR@
-JSOBJECT_JAR=@JSOBJECT_JAR@
-TAGSOUP_JAR=@TAGSOUP_JAR@
-RHINO_JAR=@RHINO_JAR@
-MSLINKS_JAR=@MSLINKS_JAR@
+rem resolve folder of this script:
+if "%ITW_HOME%" == "" (
+  set "_BAD_SLASH_SCRIPT_DIR=%~dp0"
+  set "_SCRIPT_DIR=!_BAD_SLASH_SCRIPT_DIR:\=/!"
+  set "ITW_HOME=!_SCRIPT_DIR!../"
+  set "_BAD_SLASH_SCRIPT_DIR=" & set "_SCRIPT_DIR="
+)
 
-set NASHORN=lib/ext/nashorn.jar
-set LAUNCHER_FLAGS=-Xms8m
-if "%PROGRAM_NAME%" == "javaws"  (
-  set ITW_WIN_SPECIALS=-Xnofork
-) else (
- set ITW_WIN_SPECIALS=
+rem resolve custom JRE:
+set "CUSTOM_JRE="
+if not "%JAVA_HOME%" == "" (
+  "%JAVA_HOME%/bin/java.exe" -version > nul 2>&1
+  if errorlevel 0 if not errorlevel 1 (
+    set "CUSTOM_JRE=%JAVA_HOME%"
+  ) else (
+    echo "Your custom JRE [%JAVA_HOME%] read from JAVA_HOME is not valid. Please fix this."
+  )
+)
+if "%CUSTOM_JRE%" == "" (
+  if not "%INST_JAVA_HOME%" == "" (
+    "%INST_JAVA_HOME%/bin/java.exe" -version > nul 2>&1
+    if errorlevel 0 if not errorlevel 1 (
+      set "CUSTOM_JRE=%INST_JAVA_HOME%"
+    ) else (
+      echo "Your custom JRE [%INST_JAVA_HOME%] read from INST_JAVA_HOME is not valid. Please fix this."
+    )
+  )
+)  
+if "%CUSTOM_JRE%" == "" (
+  rem the following is for testing-only and not intended to be robust
+  rem will not work from 32-bit firefox
+  for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit"') do set "_version_key=%%a"
+  set "_version=!_version_key:~58!"
+  for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit\!_version!" /v JavaHome') do set "_jh_key=%%a"
+  set "_BAD_SLASH_JAVA_HOME=!_jh_key:~22!"
+  set "_REG_JAVA_HOME=!_BAD_SLASH_JAVA_HOME:\=/!"
+  "!_REG_JAVA_HOME!/bin/java.exe" -version > nul 2>&1
+  if errorlevel 0 if not errorlevel 1 (
+    set "CUSTOM_JRE=!_REG_JAVA_HOME!"
+  ) else (
+    echo "Your custom JRE [!_REG_JAVA_HOME!] read from Registry HKLM\SOFTWARE\JavaSoft\Java Development Kit is not valid. Please fix this."  
+  )
+  set "_version_key=" & set "_version=" & set "_jh_key=" & set "_BAD_SLASH_JAVA_HOME=" & set "_REG_JAVA_HOME="
 )
 
 
-rem warning for linux users: when you put VAR="value" also quotes are stored in VAR!
-rem maybe set "VAR=value" is working better?
-
-set INST_JAVA_HOME=
-set BAD_SLASH_SCRIPT_DIR=%~dp0
-set SCRIPT_DIR=%BAD_SLASH_SCRIPT_DIR:\=/%
-set ITW_HOME=%SCRIPT_DIR%../
+rem Support portable ITW:
+if "%ITW_HOME%" == "" if not "%INST_ITW_HOME%" == "" (
+  set "ITW_HOME=%INST_ITW_HOME%"
+)
+if not "%ITW_HOME%" == "" (
+  set "BINARY_LOCATION=%ITW_HOME%/bin/%PROGRAM_NAME%.bat"
+  set "SPLASH_LOCATION=%ITW_HOME%/share/icedtea-web/javaws_splash.png"
+  set "RUN_ARGS_LOCATION=%ITW_HOME%/bin/itw-modularjdk.args"
+  set "NETX_JAR=%ITW_HOME%/share/icedtea-web/javaws.jar"
+  set "PLUGIN_JAR=%ITW_HOME%/share/icedtea-web/plugin.jar"
+  set "JSOBJECT_JAR=%ITW_HOME%/share/icedtea-web/jsobject.jar"
+  set "LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:!NETX_JAR!;!PLUGIN_JAR!;!JSOBJECT_JAR!;%ITW_HOME%/win-deps-runtime/tagsoup.jar;%ITW_HOME%/win-deps-runtime/js.jar;%ITW_HOME%/win-deps-runtime/mslinks.jar"
+)
 
-rem the following is for testing-only and not intended to be robust
-rem will not work from 32-bit firefox
-for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit"') do set "version_key=%%a"
-set "version=%version_key:~58%"
-for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit\%version%" /v JavaHome') do set "jh_key=%%a"
-set BAD_SLASH_JAVA_HOME=%jh_key:~22%
-set REG_JAVA_HOME=%BAD_SLASH_JAVA_HOME:\=/%
-"%REG_JAVA_HOME%/bin/java.exe" -version
-if errorlevel 0 if not errorlevel 1 (
-    set JAVA_HOME=%REG_JAVA_HOME%
+
+rem Fix classpaths for custom JRE:
+if not "%CUSTOM_JRE%" == "" (
+  set "JAVA=%CUSTOM_JRE%/bin/java"
+  set "CP=%CUSTOM_JRE%/lib/rt.jar;%CUSTOM_JRE%/lib/jfxrt.jar"
+  set "LAUNCHER_BOOTCLASSPATH=%LAUNCHER_BOOTCLASSPATH%;%CUSTOM_JRE%/%NASHORN%"
+) else (
+  set "LAUNCHER_BOOTCLASSPATH=%LAUNCHER_BOOTCLASSPATH%;%JRE%/%NASHORN%"
 )
 
 
-if "%INST_JAVA_HOME%" == ""  (
-  if not "%JAVA_HOME%" == ""  (
-  set CP=%JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/jfxrt.jar
-  set NASHORN=%JAVA_HOME%/%NASHORN%
-  set JAVA=%JAVA_HOME%/bin/java
-  ) else (
-    set CP=@JRE@/lib/rt.jar;@JRE@/lib/jfxrt.jar
-    set NASHORN=@JRE@/%NASHORN%
-    set JAVA=@JAVA@
+rem Support Modular JDK (jigsaw):
+set "MODULAR_JDK=NO"
+
+rem Parse Java Version
+set "fullversion="
+rem capture stderr with 2^>^&1 1^>con:
+for /f "tokens=*" %%a in ('"%JAVA%" -version 2^>^&1 1^>con:') do (
+  set "_versionLine=%%a"
+  echo !_versionLine!
+  if "!fullversion!" == "" (
+    set "_unquoted=!_versionLine:"=@!"
+    for /f "tokens=2,3 delims=@.-" %%b in ("!_unquoted!") do (
+      set "fullversion=%%b"
+      rem get second digit for "1.x.y"
+      if !fullversion! EQU 1 (
+        set "fullversion=%%c"
+      )
+    )                                  
   )
-) else (
-  set CP=%INST_JAVA_HOME%/lib/rt.jar;%INST_JAVA_HOME%/lib/jfxrt.jar
-  set NASHORN=%INST_JAVA_HOME%/%NASHORN%
-  set JAVA=%INST_JAVA_HOME%/bin/java
 )
+if %fullversion% GEQ 9 (
+  set "MODULAR_JDK=YES"
+)
+set "_versionLine=" & set "_unquoted=" & set "fullversion="
 
-if "%ITW_HOME%" == ""  (
-  if not "%INST_ITW_HOME%" == ""  (
-  set SPLASH_LOCATION=%INST_ITW_HOME%/share/icedtea-web/javaws_splash.png
-  set BINARY_LOCATION=%INST_ITW_HOME%/bin/@PROGRAM_NAME@.bat
-  set LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:%INST_ITW_HOME%/share/icedtea-web/netx.jar;%INST_ITW_HOME%/share/icedtea-web/plugin.jar;%INST_ITW_HOME%/share/icedtea-web/jsobject.jar;%INST_ITW_HOME%/win-deps-runtime/js.jar;%INST_ITW_HOME%/win-deps-runtime/tagsoup.jar;%INST_ITW_HOME%/win-deps-runtime/mslinks.jar;%NASHORN%
-  ) else (
-    set SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@
-    set BINARY_LOCATION=@BIN_LOCATION@.bat
-    set LAUNCHER_BOOTCLASSPATH=@LAUNCHER_BOOTCLASSPATH@;%NASHORN%
+set "MODULAR_ARGS="
+if "%MODULAR_JDK%" == "YES" (
+  rem warning extra escaping
+  set "MODULAR_ARGS=--patch-module "java.desktop=%NETX_JAR%;%PLUGIN_JAR%""
+  rem jsobject must be patched separately from plugin
+  rem otherwise netscape pkg would be shared by two modules, which is forbiden
+  rem plugin jar may not be built
+  if not "%JSOBJECT_JAR%" == "" (
+    set "MODULAR_ARGS=!MODULAR_ARGS! --patch-module "jdk.jsobject=%JSOBJECT_JAR%""
   )
-) else (
-  set SPLASH_LOCATION=%ITW_HOME%/share/icedtea-web/javaws_splash.png
-  set BINARY_LOCATION=%ITW_HOME%/bin/@PROGRAM_NAME@.bat
-  set LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:%ITW_HOME%/share/icedtea-web/netx.jar;%ITW_HOME%/share/icedtea-web/plugin.jar;%ITW_HOME%/share/icedtea-web/jsobject.jar;%ITW_HOME%/win-deps-runtime/js.jar;%ITW_HOME%/win-deps-runtime/tagsoup.jar;%ITW_HOME%/win-deps-runtime/mslinks.jar;%NASHORN%
+  rem add JDK9+ arg file:
+  set "MODULAR_ARGS=!MODULAR_ARGS! "@%RUN_ARGS_LOCATION%""
 )
 
 
+rem Filter script args:
+set "SPLASH=false"
+if "%ICEDTEA_WEB_SPLASH%" == "" (
+  set "SPLASH=true"
+)
 
-rem TODO use "exec -a %PROGRAM_NAME% ..." idiom
-"%JAVA%" "-splash:%SPLASH_LOCATION%" "%LAUNCHER_BOOTCLASSPATH%" %LAUNCHER_FLAGS% %JAVAWS_J_OPTIONS% "-classpath" "%CP%" "-Dicedtea-web.bin.name=%PROGRAM_NAME%" "-Dicedtea-web.bin.location=%BINARY_LOCATION%" "%CLASSNAME%" %ITW_WIN_SPECIALS% %*
+set "JAVA_ARGS="
+set "ARGS="
 
-SET errno=%ERRORLEVEL%
+for %%a IN (%*) do (
+  set "_arg=%%a"
+  set "_beg=!_arg:~0,2!"
+  if "!_beg!" == "-J" (
+    set "JAVA_ARGS=!JAVA_ARGS! !_arg:~2!"
+  ) else (
+    set "ARGS=!ARGS! !_arg!"
+    if "!_arg:~0,1!" == "-" if not "x!_arg:headless=!" == "x!_arg!" (
+      set "SPLASH=false"
+    )
+  )
+)
+set "_arg=" & set "_beg="
 
 
+rem Build Java command line:
+
+if "%SPLASH%" == "true" (
+  set "SPLASH="-splash:%SPLASH_LOCATION%""
+) else (
+  set "SPLASH="
+)
+
+"%JAVA%" %SPLASH% "%LAUNCHER_BOOTCLASSPATH%" %LAUNCHER_FLAGS% %MODULAR_ARGS% %JAVAWS_J_OPTIONS% %JAVA_ARGS% -classpath "%CP%" "-Dicedtea-web.bin.name=%PROGRAM_NAME%" "-Dicedtea-web.bin.location=%BINARY_LOCATION%" "%CLASSNAME%" %ARGS%
+
+SET "errno=%ERRORLEVEL%"
+
 echo Please press any key to close this window/get back prompt
 pause > nul
 EXIT /B %errno%
+
--- a/launcher/launchers.sh.in	Mon Feb 25 14:00:34 2019 +0100
+++ b/launcher/launchers.sh.in	Mon Feb 25 14:45:23 2019 +0100
@@ -1,23 +1,28 @@
 #!/bin/bash
 
 NASHORN=lib/ext/nashorn.jar
-JAVA=@JAVA@
+JRE=@JRE@
+JAVA=$JRE/bin/java
 LAUNCHER_BOOTCLASSPATH='@LAUNCHER_BOOTCLASSPATH@'
 LAUNCHER_FLAGS=-Xms8m
 CLASSNAME=@MAIN_CLASS@
 BINARY_LOCATION=@BIN_LOCATION@
 SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@
+RUN_ARGS_LOCATION=@MODULARJDK_ARGS_LOCATION@
 PROGRAM_NAME=@PROGRAM_NAME@
-CP=@JRE@/lib/rt.jar:@JRE@/lib/jfxrt.jar
+CP=$JRE/lib/rt.jar:$JRE/lib/jfxrt.jar
+
 # individual parts of bootclasspath for more easy processing
 NETX_JAR=@NETX_JAR@
 PLUGIN_JAR=@PLUGIN_JAR@
 JSOBJECT_JAR=@JSOBJECT_JAR@
 TAGSOUP_JAR=@TAGSOUP_JAR@
 RHINO_JAR=@RHINO_JAR@
-MSLINKS_JAR=@MSLINKS_JAR@
+# windows only:
+#MSLINKS_JAR=@MSLINKS_JAR@
 
-## resolve folder of this script, following all symlinks,
+
+## resolve folder of this script, following all symlinks:
 ## http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
 SCRIPT_SOURCE="${BASH_SOURCE[0]}"
 while [ -h "$SCRIPT_SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
@@ -29,6 +34,8 @@
 readonly SCRIPT_DIR="$( cd -P "$( dirname "$SCRIPT_SOURCE" )" && pwd )"
 readonly PORTABLE_ITW_HOME="`dirname $SCRIPT_DIR`"
 
+
+## resolve custom JRE:
 CONFIG_HOME=$XDG_CONFIG_HOME
 if [ "x$CONFIG_HOME" = "x" ] ; then
   CONFIG_HOME=~/.config
@@ -45,7 +52,8 @@
   CUSTOM_JRE=`grep "$CUSTOM_JRE_REGEX" /etc/.java/.deploy/deployment.properties 2>/dev/null |  sed "s/$CUSTOM_JRE_REGEX//g"`
 fi;
 
-# as used in windows lunchers, supporting portable ITW
+
+# Support portable ITW:
 # note, that this is temporary, experimental solution, moreover for 1.7 and will likely change since 1.8
 # by this, sh launchers can be again a bit more portable then win ones, thats why we moved to native ones since 1.8
 # still this is very dummy
@@ -54,20 +62,22 @@
 fi
 if [ "x$ITW_LIBS" == "xBUNDLED" -o ! "x$ITW_HOME" = "x" ] ; then
   if [ "x$ITW_HOME" = "x" ] ; then
-    LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`:$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`:$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`:$PORTABLE_ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$PORTABLE_ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`"
-BINARY_LOCATION="$PORTABLE_ITW_HOME/bin/`basename  \"$BINARY_LOCATION \"`"
-SPLASH_LOCATION="$PORTABLE_ITW_HOME/share/icedtea-web/`basename  \"$SPLASH_LOCATION \"`"
-echo "warning, using portable itw from $PORTABLE_ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION"
-  else
-    LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`:$ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`:$ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`"
-BINARY_LOCATION="$ITW_HOME/bin/`basename  \"$BINARY_LOCATION \"`"
-SPLASH_LOCATION="$ITW_HOME/share/icedtea-web/`basename  \"$SPLASH_LOCATION\"`"
-echo "warning, using portable itw from $ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION"
+    ITW_HOME=$PORTABLE_ITW_HOME
   fi
+  BINARY_LOCATION="$ITW_HOME/bin/`basename \"$BINARY_LOCATION\"`"
+  SPLASH_LOCATION="$ITW_HOME/share/icedtea-web/`basename \"$SPLASH_LOCATION\"`"
+  RUN_ARGS_LOCATION="$ITW_HOME/bin/`basename \"$RUN_ARGS_LOCATION\"`"
+  NETX_JAR="$ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`"
+  PLUGIN_JAR="$ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`"
+  JSOBJECT_JAR="$ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`"
+  LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$NETX_JAR:$PLUGIN_JAR:$JSOBJECT_JAR:$ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`"
+  echo "warning, using portable itw from $ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION"
 fi
 
+
+# Fix classpaths for custom JRE:
 if [ "x$CUSTOM_JRE" != "x" ] ; then
-  if [ -e  "$CUSTOM_JRE" -a -e "$CUSTOM_JRE/bin/java" ] ; then
+  if [ -e "$CUSTOM_JRE" -a -e "$CUSTOM_JRE/bin/java" ] ; then
     JAVA=$CUSTOM_JRE/bin/java
     CP=$CUSTOM_JRE/lib/rt.jar:$CUSTOM_JRE/lib/jfxrt.jar
     LAUNCHER_BOOTCLASSPATH=$LAUNCHER_BOOTCLASSPATH:$CUSTOM_JRE/$NASHORN
@@ -75,18 +85,23 @@
     echo "Your custom JRE $CUSTOM_JRE read from deployment.properties under key $PROPERTY_NAME as $CUSTOM_JRE is not valid. Using default ($JAVA, $CP) in attempt to start. Please fix this."
   fi
 else
-  LAUNCHER_BOOTCLASSPATH="$LAUNCHER_BOOTCLASSPATH:@JRE@/$NASHORN"
+  LAUNCHER_BOOTCLASSPATH="$LAUNCHER_BOOTCLASSPATH:$JRE/$NASHORN"
 fi;
 
+
+# Support Modular JDK (jigsaw):
 MODULAR_JDK="NO"
-version=`${JAVA} -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1`
+fullversion=`${JAVA} -version 2>&1`
+version=`echo $fullversion | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1`
 if [ $version -eq "1" ]; then
-  version=`${JAVA} -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2`
+  version=`echo $fullversion | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2`
 fi
 if [ $version -ge "9" ]; then
   MODULAR_JDK="YES"
 fi
 
+
+# Build Java command line:
 JAVA_ARGS=( )
 ARGS=( )
 COMMAND=()
@@ -94,10 +109,12 @@
 i=0
 j=0
 
+# Filter script args:
 SPLASH="false"
 if [ "x$ICEDTEA_WEB_SPLASH" = "x" ] ; then
-SPLASH="true"
+  SPLASH="true"
 fi;
+
 while [ "$#" -gt "0" ]; do
   case "$1" in
     -J*)
@@ -115,12 +132,13 @@
   shift
 done
 
+# TODO: inline args without using COMMAND[array] to unify linux/windows scripts
 k=0
 COMMAND[k]="${JAVA}"
 k=$((k+1))
 if [ "$SPLASH" = "true" ] ; then
-COMMAND[k]="-splash:${SPLASH_LOCATION}"
-k=$((k+1))
+  COMMAND[k]="-splash:${SPLASH_LOCATION}"
+  k=$((k+1))
 fi;
 COMMAND[k]="${LAUNCHER_BOOTCLASSPATH}"
 k=$((k+1))
@@ -128,94 +146,23 @@
 k=$((k+1))
 
 if [ "x$MODULAR_JDK" == "xYES" ] ; then
-COMMAND[k]="--patch-module"
-k=$((k+1))
-COMMAND[k]="java.desktop=@PLUGIN_JAR@:@NETX_JAR@"
-k=$((k+1))
-# jsobject must be pathched separately from plugin
-# otherwise netscape pkg would be shared by two modules, which is forbiden
-JSOBJECT_JAR=@JSOBJECT_JAR@
-# plugin jar may not be built
-if [ ! "x$JSOBJECT_JAR" == "x" ] ; then
   COMMAND[k]="--patch-module"
   k=$((k+1))
-  COMMAND[k]="jdk.jsobject=$JSOBJECT_JAR"
+  COMMAND[k]="java.desktop=$NETX_JAR:$PLUGIN_JAR"
   k=$((k+1))
-fi
-
-COMMAND[k]="--add-reads"
-k=$((k+1))
-COMMAND[k]="java.base=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-reads"
-k=$((k+1))
-COMMAND[k]="java.desktop=ALL-UNNAMED,java.naming"
-k=$((k+1))
-COMMAND[k]="--add-reads"
-k=$((k+1))
-COMMAND[k]="java.naming=ALL-UNNAMED,java.desktop"
-k=$((k+1))
+  # jsobject must be patched separately from plugin
+  # otherwise netscape pkg would be shared by two modules, which is forbiden
+  # plugin jar may not be built
+  if [ ! "x$JSOBJECT_JAR" == "x" ] ; then
+    COMMAND[k]="--patch-module"
+    k=$((k+1))
+    COMMAND[k]="jdk.jsobject=$JSOBJECT_JAR"
+    k=$((k+1))
+  fi
 
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.desktop/sun.awt=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.desktop/javax.jnlp=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.security.provider=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.security.util=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.security.x509=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/jdk.internal.util.jar=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.security.validator=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/com.sun.net.ssl.internal.ssl=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.net.www.protocol.jar=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.desktop/sun.awt.X11=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.naming/com.sun.jndi.toolkit.url=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.desktop/sun.applet=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.security.action=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.base/sun.net.www.protocol.http=ALL-UNNAMED,java.desktop"
-k=$((k+1))
-COMMAND[k]="--add-exports"
-k=$((k+1))
-COMMAND[k]="java.desktop/sun.applet=ALL-UNNAMED,jdk.jsobject"
-k=$((k+1))
+  # add JDK9+ arg file:
+  COMMAND[k]="@$RUN_ARGS_LOCATION"
+  k=$((k+1))
 fi
 
 
@@ -225,14 +172,17 @@
   i=$((i+1))
   k=$((k+1))
 done
+
 COMMAND[k]="-classpath"
 k=$((k+1))
 COMMAND[k]="${CP}"
 k=$((k+1))
+
 COMMAND[k]="-Dicedtea-web.bin.name=${PROGRAM_NAME}"
 k=$((k+1))
 COMMAND[k]="-Dicedtea-web.bin.location=${BINARY_LOCATION}"
 k=$((k+1))
+
 COMMAND[k]="${CLASSNAME}"
 k=$((k+1))
 j=0
@@ -245,3 +195,4 @@
 exec -a "$PROGRAM_NAME" "${COMMAND[@]}"
 
 exit $?
+