--- old/src/jdk.incubator.jpackage/macosx/native/applauncher/MacLauncher.cpp 2020-08-19 13:45:13.119527600 -0400 +++ new/src/jdk.incubator.jpackage/macosx/native/applauncher/MacLauncher.cpp 2020-08-19 13:45:11.925799700 -0400 @@ -52,6 +52,8 @@ jvmLauncher = AppLauncher() .setImageRoot(appImageRoot) .addJvmLibName(_T("Contents/Home/lib/libjli.dylib")) + // add backup - older version such as JDK11 have it in jli sub-dir + .addJvmLibName(_T("Contents/Home/lib/jli/libjli.dylib")) .setAppDir(FileUtils::mkpath() << appImageRoot << _T("Contents/app")) .setDefaultRuntimePath(FileUtils::mkpath() << appImageRoot << _T("Contents/runtime")) --- old/src/jdk.incubator.jpackage/share/classes/jdk/incubator/jpackage/internal/CfgFile.java 2020-08-19 13:45:22.570983200 -0400 +++ new/src/jdk.incubator.jpackage/share/classes/jdk/incubator/jpackage/internal/CfgFile.java 2020-08-19 13:45:21.385699800 -0400 @@ -35,6 +35,7 @@ import static jdk.incubator.jpackage.internal.StandardBundlerParam.APP_NAME; import static jdk.incubator.jpackage.internal.StandardBundlerParam.JAVA_OPTIONS; import static jdk.incubator.jpackage.internal.StandardBundlerParam.ARGUMENTS; +import static jdk.incubator.jpackage.internal.StandardBundlerParam.VERSION; /** * App launcher's config file. @@ -49,6 +50,7 @@ launcherName = APP_NAME.fetchFrom(params); javaOptions = JAVA_OPTIONS.fetchFrom(params); arguments = ARGUMENTS.fetchFrom(params); + version = VERSION.fetchFrom(params); return this; } @@ -82,11 +84,22 @@ ApplicationLayout appImagelayout = appLayout.resolveAt(appImage); Path modsDir = appImagelayout.appModsDirectory(); - if (!javaOptions.isEmpty() || Files.isDirectory(modsDir)) { - content.add(Map.entry("[JavaOptions]", SECTION_TAG)); - for (var value : javaOptions) { - content.add(Map.entry("java-options", value)); - } + + content.add(Map.entry("[JavaOptions]", SECTION_TAG)); + + // always let app know it's name and version + content.add(Map.entry( + "java-options", "-Djpackage.app-name=" + launcherName)); + content.add(Map.entry( + "java-options", "-Djpackage.app-version=" + version)); + + // add user supplied java options if there are any + for (var value : javaOptions) { + content.add(Map.entry("java-options", value)); + } + + // add module path if there is one + if (Files.isDirectory(modsDir)) { content.add(Map.entry("java-options", "--module-path")); content.add(Map.entry("java-options", appCfgLayout.appModsDirectory())); @@ -126,6 +139,7 @@ } private String launcherName; + private String version; private LauncherData launcherData; List arguments; List javaOptions; --- old/src/jdk.incubator.jpackage/share/native/applauncher/JvmLauncher.cpp 2020-08-19 13:45:31.790123600 -0400 +++ new/src/jdk.incubator.jpackage/share/native/applauncher/JvmLauncher.cpp 2020-08-19 13:45:30.584792400 -0400 @@ -89,6 +89,11 @@ } } while (0); + do { + addArgument(_T("-Djpackage.app-path=") + + SysInfo::getProcessModulePath()); + } while (0); + // No validation of data in config file related to how Java app should be // launched intentionally. // Just read what is in config file and put on jvm's command line as is.