# HG changeset patch # User mchung # Date 1466380009 25200 # Node ID e97953d38291d9ca988a536b8664fb133fa2bb07 # Parent 2a5697a98620c4f40e4a1a71478464399b8878de 8155955: packager needs to determine the root modules to create JRE image Reviewed-by: alanb diff -r 2a5697a98620 -r e97953d38291 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java Wed Jul 05 21:52:00 2017 +0200 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java Sun Jun 19 16:46:49 2016 -0700 @@ -39,15 +39,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Date; -import java.util.Formatter; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import jdk.internal.module.ConfigurableModuleFinder; @@ -96,11 +88,9 @@ }, "--help"), new Option(true, (task, opt, arg) -> { String[] dirs = arg.split(File.pathSeparator); - task.options.modulePath = new Path[dirs.length]; - int i = 0; - for (String dir : dirs) { - task.options.modulePath[i++] = Paths.get(dir); - } + Arrays.stream(dirs) + .map(Paths::get) + .forEach(task.options.modulePath::add); }, "--modulepath", "--mp"), new Option(true, (task, opt, arg) -> { for (String mn : arg.split(",")) { @@ -176,7 +166,7 @@ String saveoptsfile; boolean version; boolean fullVersion; - Path[] modulePath; + List modulePath = new ArrayList<>(); Set limitMods = new HashSet<>(); Set addMods = new HashSet<>(); Path output; @@ -203,7 +193,7 @@ return EXIT_OK; } if (taskHelper.getExistingImage() == null) { - if (options.modulePath == null || options.modulePath.length == 0) { + if (options.modulePath == null || options.modulePath.isEmpty()) { throw taskHelper.newBadArgs("err.modulepath.must.be.specified").showUsage(true); } createImage(); @@ -245,7 +235,7 @@ * Jlink API entry point. */ public static void createImage(JlinkConfiguration config, - PluginsConfiguration plugins) + PluginsConfiguration plugins) throws Exception { Objects.requireNonNull(config); Objects.requireNonNull(config.getOutput()); @@ -254,10 +244,9 @@ if (config.getModulepaths().isEmpty()) { throw new Exception("Empty module paths"); } - Path[] arr = new Path[config.getModulepaths().size()]; - arr = config.getModulepaths().toArray(arr); + ModuleFinder finder - = newModuleFinder(arr, config.getLimitmods(), config.getModules()); + = newModuleFinder(config.getModulepaths(), config.getLimitmods(), config.getModules()); // First create the image provider ImageProvider imageProvider @@ -332,10 +321,12 @@ return addMods; } - private static ModuleFinder newModuleFinder(Path[] paths, - Set limitMods, - Set addMods) { - ModuleFinder finder = ModuleFinder.of(paths); + public static ModuleFinder newModuleFinder(List paths, + Set limitMods, + Set addMods) + { + + ModuleFinder finder = ModuleFinder.of(paths.toArray(new Path[0])); // jmods are located at link-time if (finder instanceof ConfigurableModuleFinder) { diff -r 2a5697a98620 -r e97953d38291 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java Wed Jul 05 21:52:00 2017 +0200 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java Sun Jun 19 16:46:49 2016 -0700 @@ -27,36 +27,19 @@ import jdk.tools.jlink.Jlink; -import jdk.tools.jlink.builder.ImageBuilder; +import jdk.tools.jlink.builder.DefaultImageBuilder; +import jdk.tools.jlink.internal.JlinkTask; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.builder.*; -import jdk.tools.jlink.plugin.ModulePool; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringReader; +import java.lang.module.ModuleFinder; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Properties; -import java.util.ResourceBundle; import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeSet; -import java.util.stream.Collectors; /** * AppRuntimeImageBuilder is a private API used only by the Java Packager to generate @@ -143,4 +126,14 @@ Jlink jlink = new Jlink(); jlink.build(jlinkConfig, pluginConfig); } + + /** + * Returns a ModuleFinder that limits observability to the given root + * modules, their transitive dependences, plus a set of other modules. + */ + public static ModuleFinder moduleFinder(List modulepaths, + Set roots, + Set otherModules) { + return JlinkTask.newModuleFinder(modulepaths, roots, otherModules); + } }