# HG changeset patch # User herrick # Date 1545163845 18000 # Node ID 8f9cf6ad59f05e1dfec121771d91c8e83cd4fda8 # Parent 687505381ca41d74b8c61fe06179203a872f8294 8213962: JPackageCreateImageRuntimeModuleTest fails Reviewed-by: almatvee, kcr diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppImageBuilder.java --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppImageBuilder.java Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppImageBuilder.java Tue Dec 18 15:10:45 2018 -0500 @@ -59,6 +59,7 @@ private final Path root; private final Path appDir; + private final Path appModsDir; private final Path runtimeDir; private final Path resourcesDir; private final Path mdir; @@ -91,6 +92,7 @@ this.root = imageOutDir.resolve(APP_NAME.fetchFrom(config)); this.appDir = root.resolve("app"); + this.appModsDir = appDir.resolve("mods"); this.runtimeDir = root.resolve("runtime"); this.resourcesDir = root.resolve("resources"); this.mdir = runtimeDir.resolve("lib"); @@ -110,6 +112,7 @@ this.root = imageOutDir.resolve(appName); this.appDir = null; + this.appModsDir = null; this.runtimeDir = null; this.resourcesDir = null; this.mdir = null; @@ -170,6 +173,16 @@ } @Override + public Path getAppDir() { + return appDir; + } + + @Override + public Path getAppModsDir() { + return appModsDir; + } + + @Override public InputStream getResourceAsStream(String name) { return LinuxResources.class.getResourceAsStream(name); } diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppImageBuilder.java --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppImageBuilder.java Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppImageBuilder.java Tue Dec 18 15:10:45 2018 -0500 @@ -77,6 +77,7 @@ private final Path root; private final Path contentsDir; private final Path javaDir; + private final Path javaModsDir; private final Path resourcesDir; private final Path macOSDir; private final Path runtimeDir; @@ -204,6 +205,7 @@ this.root = imageOutDir.resolve(APP_NAME.fetchFrom(params) + ".app"); this.contentsDir = root.resolve("Contents"); this.javaDir = contentsDir.resolve("Java"); + this.javaModsDir = javaDir.resolve("mods"); this.resourcesDir = contentsDir.resolve("Resources"); this.macOSDir = contentsDir.resolve("MacOS"); this.runtimeDir = contentsDir.resolve("PlugIns/Java.runtime"); @@ -225,6 +227,7 @@ this.root = imageOutDir.resolve(jreName ); this.contentsDir = root.resolve("Contents"); this.javaDir = null; + this.javaModsDir = null; this.resourcesDir = null; this.macOSDir = null; this.runtimeDir = this.root; @@ -315,6 +318,16 @@ } @Override + public Path getAppDir() { + return javaDir; + } + + @Override + public Path getAppModsDir() { + return javaModsDir; + } + + @Override public InputStream getResourceAsStream(String name) { return MacResources.class.getResourceAsStream(name); } diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/share/classes/jdk/jpackage/internal/AbstractAppImageBuilder.java --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/AbstractAppImageBuilder.java Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/AbstractAppImageBuilder.java Tue Dec 18 15:10:45 2018 -0500 @@ -65,6 +65,8 @@ public abstract InputStream getResourceAsStream(String name); public abstract void prepareApplicationFiles() throws IOException; public abstract void prepareJreFiles() throws IOException; + public abstract Path getAppDir(); + public abstract Path getAppModsDir(); public Map getProperties() { return this.properties; @@ -242,6 +244,11 @@ for (String arg : jvmargs) { out.println(arg); } + Path modsDir = getAppModsDir(); + if (modsDir != null && modsDir.toFile().exists()) { + out.println("--module-path"); + out.println(getAppDir().relativize(modsDir)); + } Map jvmProps = JVM_PROPERTIES.fetchFrom(params); for (Map.Entry property : jvmProps.entrySet()) { out.println("-D" + property.getKey() + "=" + property.getValue()); diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java Tue Dec 18 15:10:45 2018 -0500 @@ -96,6 +96,31 @@ }); } + public static void copyRecursive(Path src, Path dest, + final List excludes) throws IOException { + Files.walkFileTree(src, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(final Path dir, + final BasicFileAttributes attrs) throws IOException { + if (excludes.contains(dir.toFile().getName())) { + return FileVisitResult.SKIP_SUBTREE; + } else { + Files.createDirectories(dest.resolve(src.relativize(dir))); + return FileVisitResult.CONTINUE; + } + } + + @Override + public FileVisitResult visitFile(final Path file, + final BasicFileAttributes attrs) throws IOException { + if (!excludes.contains(file.toFile().getName())) { + Files.copy(file, dest.resolve(src.relativize(file))); + } + return FileVisitResult.CONTINUE; + } + }); + } + public static void copyFromURL(URL location, File file) throws IOException { copyFromURL(location, file, false); } diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java Tue Dec 18 15:10:45 2018 -0500 @@ -131,17 +131,6 @@ } ); - @SuppressWarnings("unchecked") - static final StandardBundlerParam> SOURCE_FILES = - new StandardBundlerParam<>( - I18N.getString("param.source-files.name"), - I18N.getString("param.source-files.description"), - Arguments.CLIOptions.FILES.getId(), - (Class>) (Object) List.class, - p -> null, - (s, p) -> null - ); - // note that each bundler is likely to replace this one with // their own converter static final StandardBundlerParam MAIN_JAR = @@ -664,7 +653,25 @@ "message.runtime-image-dir-does-not-exist.advice"), PREDEFINED_RUNTIME_IMAGE.getID())); } - IOUtils.copyRecursive(image.toPath(), appBuilder.getRoot()); + // copy whole runtime, need to skip jmods and src.zip + final List excludes = Arrays.asList("jmods", "src.zip"); + IOUtils.copyRecursive(image.toPath(), appBuilder.getRoot(), excludes); + + // if module-path given - copy modules to appDir/mods + List modulePath = + StandardBundlerParam.MODULE_PATH.fetchFrom(p); + List defaultModulePath = getDefaultModulePath(); + Path dest = appBuilder.getAppModsDir(); + + if (dest != null) { + for (Path mp : modulePath) { + if (!defaultModulePath.contains(mp)) { + Files.createDirectories(dest); + IOUtils.copyRecursive(mp, dest); + } + } + } + appBuilder.prepareApplicationFiles(); } diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties Tue Dec 18 15:10:45 2018 -0500 @@ -65,8 +65,6 @@ param.jvm-system-properties.description=JVM System Properties (of the -Dname\=value variety). param.license-file.name=License param.license-file.description=The license file, relative to the assembled application directory. -param.source-files.name=Files -param.source-files.description=Set of files from input directory to be bundled. param.main-class.name=Main Class param.main-class.description=The main class for the application. Either a javafx.application.Application instance or a java class with a main method. param.main-module.name=Main Module diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_ja.properties --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_ja.properties Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_ja.properties Tue Dec 18 15:10:45 2018 -0500 @@ -65,8 +65,6 @@ param.jvm-system-properties.description=JVM System Properties (of the -Dname\=value variety). param.license-file.name=License param.license-file.description=The license file, relative to the assembled application directory. -param.source-files.name=Files -param.source-files.description=Set of files from input directory to be bundled. param.main-class.name=Main Class param.main-class.description=The main class for the application. Either a javafx.application.Application instance or a java class with a main method. param.main-module.name=Main Module diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_zh_CN.properties --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_zh_CN.properties Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_zh_CN.properties Tue Dec 18 15:10:45 2018 -0500 @@ -65,8 +65,6 @@ param.jvm-system-properties.description=JVM System Properties (of the -Dname\=value variety). param.license-file.name=License param.license-file.description=The license file, relative to the assembled application directory. -param.source-files.name=Files -param.source-files.description=Set of files from input directory to be bundled. param.main-class.name=Main Class param.main-class.description=The main class for the application. Either a javafx.application.Application instance or a java class with a main method. param.main-module.name=Main Module diff -r 687505381ca4 -r 8f9cf6ad59f0 src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsAppImageBuilder.java --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsAppImageBuilder.java Tue Dec 18 15:08:56 2018 -0500 +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsAppImageBuilder.java Tue Dec 18 15:10:45 2018 -0500 @@ -72,6 +72,7 @@ private final Path root; private final Path appDir; + private final Path appModsDir; private final Path runtimeDir; private final Path mdir; @@ -140,6 +141,7 @@ this.root = imageOutDir.resolve(APP_NAME.fetchFrom(params)); this.appDir = root.resolve("app"); + this.appModsDir = appDir.resolve("mods"); this.runtimeDir = root.resolve("runtime"); this.mdir = runtimeDir.resolve("lib"); Files.createDirectories(appDir); @@ -155,6 +157,7 @@ this.params = null; this.root = imageOutDir.resolve(jreName); this.appDir = null; + this.appModsDir = null; this.runtimeDir = root; this.mdir = runtimeDir.resolve("lib"); Files.createDirectories(runtimeDir); @@ -241,6 +244,16 @@ } @Override + public Path getAppDir() { + return appDir; + } + + @Override + public Path getAppModsDir() { + return appModsDir; + } + + @Override public InputStream getResourceAsStream(String name) { return WinResources.class.getResourceAsStream(name); } diff -r 687505381ca4 -r 8f9cf6ad59f0 test/jdk/tools/jpackage/createimage/JPackageCreateImageBuildRootTest.java --- a/test/jdk/tools/jpackage/createimage/JPackageCreateImageBuildRootTest.java Tue Dec 18 15:08:56 2018 -0500 +++ b/test/jdk/tools/jpackage/createimage/JPackageCreateImageBuildRootTest.java Tue Dec 18 15:10:45 2018 -0500 @@ -25,6 +25,7 @@ /* * @test + * @requires (os.family == "windows") * @summary jpackage create image to test --build-root * @library ../helpers * @build JPackageHelper