--- old/modules/jdk.packager/src/main/java/com/oracle/tools/packager/StandardBundlerParam.java 2016-10-05 08:06:53.000000000 -0700 +++ new/modules/jdk.packager/src/main/java/com/oracle/tools/packager/StandardBundlerParam.java 2016-10-05 08:06:53.000000000 -0700 @@ -156,7 +156,11 @@ params -> { //FIXME sniff modules extractMainClassInfoFromAppResources(params); - return (String) params.get(BundleParams.PARAM_APPLICATION_CLASS); + String s = (String) params.get(BundleParams.PARAM_APPLICATION_CLASS); + if (s == null) { + s = JLinkBundlerHelper.getMainClass(params); + } + return s; }, (s, p) -> s ); --- old/modules/jdk.packager/src/main/java/com/oracle/tools/packager/windows/WinAppBundler.java 2016-10-05 08:06:54.000000000 -0700 +++ new/modules/jdk.packager/src/main/java/com/oracle/tools/packager/windows/WinAppBundler.java 2016-10-05 08:06:54.000000000 -0700 @@ -200,7 +200,7 @@ String commandline; File runtimePath = JLinkBundlerHelper.getJDKHome(params).toFile(); - File launcherPath = new File(runtimePath, "bin\\java"); + File launcherPath = new File(runtimePath, "bin\\java.exe"); ProcessBuilder pb = new ProcessBuilder(launcherPath.getAbsolutePath(), "-version"); try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { --- old/modules/jdk.packager/src/main/java/com/sun/javafx/tools/packager/DeployParams.java 2016-10-05 08:06:55.000000000 -0700 +++ new/modules/jdk.packager/src/main/java/com/sun/javafx/tools/packager/DeployParams.java 2016-10-05 08:06:55.000000000 -0700 @@ -535,7 +535,7 @@ // Success if (((applicationClass != null && !applicationClass.isEmpty()) || - !module.isEmpty())) { + (module != null && !module.isEmpty()))) { result = true; } --- old/modules/jdk.packager/src/main/java/jdk/packager/internal/JLinkBundlerHelper.java 2016-10-05 08:06:56.000000000 -0700 +++ new/modules/jdk.packager/src/main/java/jdk/packager/internal/JLinkBundlerHelper.java 2016-10-05 08:06:56.000000000 -0700 @@ -30,6 +30,7 @@ import com.oracle.tools.packager.BundlerParamInfo; import com.oracle.tools.packager.RelativeFileSet; import com.oracle.tools.packager.Log; +import com.oracle.tools.packager.Platform; import java.io.ByteArrayOutputStream; import java.io.File; @@ -240,6 +241,27 @@ if (javaBasePath != null && javaBasePath.toFile().exists()) { result = javaBasePath.getParent(); + + // On a developer build the JDK Home isn't where we expect it + // relative to the jmods directory. Do some extra + // processing to find it. + if (result != null) { + boolean found = false; + Path bin = result.resolve("bin"); + + if (Files.exists(bin)) { + final String exe = (Platform.getPlatform() == Platform.WINDOWS) ? ".exe" : ""; + Path javaExe = bin.resolve("java" + exe); + + if (Files.exists(javaExe)) { + found = true; + } + } + + if (!found) { + result = result.resolve("..\\jdk"); + } + } } return result; --- old/modules/jdk.packager/src/main/native/javapackager/win/javapackager.cpp 2016-10-05 08:06:57.000000000 -0700 +++ new/modules/jdk.packager/src/main/native/javapackager/win/javapackager.cpp 2016-10-05 08:06:57.000000000 -0700 @@ -409,9 +409,7 @@ } } } - } - } } @@ -443,6 +441,22 @@ } } +#define TRAILING_PATHSEPARATOR '\\' + +std::wstring ExtractFilePath(std::wstring Path) { + std::wstring result; + size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR); + if (slash != std::wstring::npos) + result = Path.substr(0, slash); + return result; +} + +std::wstring GetCurrentExecutableName() { + TCHAR FileName[MAX_PATH]; + GetModuleFileName(NULL, FileName, MAX_PATH); + return FileName; +} + int wmain(int argc, wchar_t* argv[]) { wchar_t buf[MAX_PATH]; GetModuleFileName(NULL, buf, MAX_PATH); @@ -466,7 +480,8 @@ } } else { - javacmd = L""; + std::wstring exe = GetCurrentExecutableName(); + javacmd = ExtractFilePath(exe) + L"\\java.exe"; } if (javacmd.length() <= 0) { @@ -475,8 +490,9 @@ javacmd = jv2->path; javahome = jv2->home; } - else + else { javacmd = L"java.exe"; + } } std::wstring cmd = L"\"" + javacmd + L"\"";