8254920: Application launched with jpackage produced .exe crashes JVM
Reviewed-by: asemenyuk, almatvee, kizune
This commit is contained in:
parent
5dfb42fc68
commit
952abea47b
@ -137,6 +137,8 @@ void launchApp() {
|
|||||||
|
|
||||||
const tstring launcherPath = SysInfo::getProcessModulePath();
|
const tstring launcherPath = SysInfo::getProcessModulePath();
|
||||||
const tstring appImageRoot = FileUtils::dirname(launcherPath);
|
const tstring appImageRoot = FileUtils::dirname(launcherPath);
|
||||||
|
const tstring runtimeBinPath = FileUtils::mkpath()
|
||||||
|
<< appImageRoot << _T("runtime") << _T("bin");
|
||||||
|
|
||||||
std::unique_ptr<Jvm> jvm(AppLauncher()
|
std::unique_ptr<Jvm> jvm(AppLauncher()
|
||||||
.setImageRoot(appImageRoot)
|
.setImageRoot(appImageRoot)
|
||||||
@ -146,6 +148,10 @@ void launchApp() {
|
|||||||
<< _T("runtime"))
|
<< _T("runtime"))
|
||||||
.createJvmLauncher());
|
.createJvmLauncher());
|
||||||
|
|
||||||
|
// zip.dll may be loaded by java without full path
|
||||||
|
// make sure it will look in runtime/bin
|
||||||
|
SetDllDirectory(runtimeBinPath.c_str());
|
||||||
|
|
||||||
const DllWrapper jliDll(jvm->getPath());
|
const DllWrapper jliDll(jvm->getPath());
|
||||||
std::unique_ptr<DllWrapper> splashDll;
|
std::unique_ptr<DllWrapper> splashDll;
|
||||||
if (jvm->isWithSplash()) {
|
if (jvm->isWithSplash()) {
|
||||||
|
@ -52,6 +52,7 @@ public final class Executor extends CommandArguments<Executor> {
|
|||||||
|
|
||||||
public Executor() {
|
public Executor() {
|
||||||
saveOutputType = new HashSet<>(Set.of(SaveOutputType.NONE));
|
saveOutputType = new HashSet<>(Set.of(SaveOutputType.NONE));
|
||||||
|
removePath = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Executor setExecutable(String v) {
|
public Executor setExecutable(String v) {
|
||||||
@ -83,6 +84,11 @@ public final class Executor extends CommandArguments<Executor> {
|
|||||||
return setExecutable(v.getPath());
|
return setExecutable(v.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Executor setRemovePath(boolean value) {
|
||||||
|
removePath = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures this instance to save full output that command will produce.
|
* Configures this instance to save full output that command will produce.
|
||||||
* This function is mutual exclusive with
|
* This function is mutual exclusive with
|
||||||
@ -289,6 +295,11 @@ public final class Executor extends CommandArguments<Executor> {
|
|||||||
builder.directory(directory.toFile());
|
builder.directory(directory.toFile());
|
||||||
sb.append(String.format("; in directory [%s]", directory));
|
sb.append(String.format("; in directory [%s]", directory));
|
||||||
}
|
}
|
||||||
|
if (removePath) {
|
||||||
|
// run this with cleared Path in Environment
|
||||||
|
TKit.trace("Clearing PATH in environment");
|
||||||
|
builder.environment().remove("PATH");
|
||||||
|
}
|
||||||
|
|
||||||
trace("Execute " + sb.toString() + "...");
|
trace("Execute " + sb.toString() + "...");
|
||||||
Process process = builder.start();
|
Process process = builder.start();
|
||||||
@ -414,6 +425,7 @@ public final class Executor extends CommandArguments<Executor> {
|
|||||||
private Path executable;
|
private Path executable;
|
||||||
private Set<SaveOutputType> saveOutputType;
|
private Set<SaveOutputType> saveOutputType;
|
||||||
private Path directory;
|
private Path directory;
|
||||||
|
private boolean removePath;
|
||||||
|
|
||||||
private static enum SaveOutputType {
|
private static enum SaveOutputType {
|
||||||
NONE, FULL, FIRST_LINE, DUMP
|
NONE, FULL, FIRST_LINE, DUMP
|
||||||
|
@ -273,14 +273,15 @@ public final class HelloApp {
|
|||||||
String... args) {
|
String... args) {
|
||||||
AppOutputVerifier av = getVerifier(cmd, args);
|
AppOutputVerifier av = getVerifier(cmd, args);
|
||||||
if (av != null) {
|
if (av != null) {
|
||||||
av.executeAndVerifyOutput(args);
|
// when running app launchers, clear users environment
|
||||||
|
av.executeAndVerifyOutput(true, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Executor.Result executeLauncher(JPackageCommand cmd,
|
public static Executor.Result executeLauncher(JPackageCommand cmd,
|
||||||
String... args) {
|
String... args) {
|
||||||
AppOutputVerifier av = getVerifier(cmd, args);
|
AppOutputVerifier av = getVerifier(cmd, args);
|
||||||
return av.executeOnly(args);
|
return av.executeOnly(true, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static AppOutputVerifier getVerifier(JPackageCommand cmd,
|
private static AppOutputVerifier getVerifier(JPackageCommand cmd,
|
||||||
@ -351,7 +352,11 @@ public final class HelloApp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void executeAndVerifyOutput(String... args) {
|
public void executeAndVerifyOutput(String... args) {
|
||||||
getExecutor(args).dumpOutput().execute();
|
executeAndVerifyOutput(false, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void executeAndVerifyOutput(boolean removePath, String... args) {
|
||||||
|
getExecutor(args).dumpOutput().setRemovePath(removePath).execute();
|
||||||
|
|
||||||
final List<String> launcherArgs = List.of(args);
|
final List<String> launcherArgs = List.of(args);
|
||||||
final List<String> appArgs;
|
final List<String> appArgs;
|
||||||
@ -365,8 +370,11 @@ public final class HelloApp {
|
|||||||
verifyOutputFile(outputFile, appArgs, params);
|
verifyOutputFile(outputFile, appArgs, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Executor.Result executeOnly(String...args) {
|
public Executor.Result executeOnly(boolean removePath, String...args) {
|
||||||
return getExecutor(args).saveOutput().executeWithoutExitCodeCheck();
|
return getExecutor(args)
|
||||||
|
.saveOutput()
|
||||||
|
.setRemovePath(removePath)
|
||||||
|
.executeWithoutExitCodeCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Executor getExecutor(String...args) {
|
private Executor getExecutor(String...args) {
|
||||||
|
84
test/jdk/tools/jpackage/share/RuntimeImageTest.java
Normal file
84
test/jdk/tools/jpackage/share/RuntimeImageTest.java
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import jdk.jpackage.test.TKit;
|
||||||
|
import jdk.jpackage.test.PackageTest;
|
||||||
|
import jdk.jpackage.test.PackageType;
|
||||||
|
import jdk.jpackage.test.Functional;
|
||||||
|
import jdk.jpackage.test.Annotations.Test;
|
||||||
|
import jdk.jpackage.test.Annotations.Parameter;
|
||||||
|
import jdk.jpackage.test.PackageTest;
|
||||||
|
import jdk.jpackage.test.JPackageCommand;
|
||||||
|
import jdk.jpackage.test.JavaTool;
|
||||||
|
import jdk.jpackage.test.Executor;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @summary jpackage with --runtime-image
|
||||||
|
* @library ../helpers
|
||||||
|
* @key jpackagePlatformPackage
|
||||||
|
* @build jdk.jpackage.test.*
|
||||||
|
* @modules jdk.incubator.jpackage/jdk.incubator.jpackage.internal
|
||||||
|
* @compile RuntimeImageTest.java
|
||||||
|
* @run main/othervm/timeout=1400 -Xmx512m jdk.jpackage.test.Main
|
||||||
|
* --jpt-run=RuntimeImageTest
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RuntimeImageTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Parameter("0")
|
||||||
|
@Parameter("1")
|
||||||
|
@Parameter("2")
|
||||||
|
public static void test(String compression) throws Exception {
|
||||||
|
final Path workDir = TKit.createTempDirectory("runtime").resolve("data");
|
||||||
|
final Path jlinkOutputDir = workDir.resolve("temp.runtime");
|
||||||
|
Files.createDirectories(jlinkOutputDir.getParent());
|
||||||
|
|
||||||
|
new Executor()
|
||||||
|
.setToolProvider(JavaTool.JLINK)
|
||||||
|
.dumpOutput()
|
||||||
|
.addArguments(
|
||||||
|
"--output", jlinkOutputDir.toString(),
|
||||||
|
"--compress=" + compression,
|
||||||
|
"--add-modules", "ALL-MODULE-PATH",
|
||||||
|
"--strip-debug",
|
||||||
|
"--no-header-files",
|
||||||
|
"--no-man-pages",
|
||||||
|
"--strip-native-commands")
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
JPackageCommand cmd = JPackageCommand.helloAppImage()
|
||||||
|
.setArgumentValue("--runtime-image", jlinkOutputDir.toString());
|
||||||
|
|
||||||
|
cmd.executeAndAssertHelloAppImageCreated();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user