--- old/src/jdk.jlink/share/classes/jdk/tools/jlink/TaskHelper.java 2015-10-03 00:56:09.236074867 +0300 +++ new/src/jdk.jlink/share/classes/jdk/tools/jlink/TaskHelper.java 2015-10-03 00:56:09.124074862 +0300 @@ -30,7 +30,10 @@ import java.io.IOException; import java.io.PrintWriter; import java.lang.module.Configuration; +import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.lang.module.ResolutionException; import java.lang.reflect.Layer; import java.nio.file.Path; import java.nio.file.Paths; @@ -44,6 +47,7 @@ import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; +import java.util.Set; import jdk.internal.module.ConfigurableModuleFinder; import jdk.internal.module.ConfigurableModuleFinder.Phase; @@ -285,9 +289,7 @@ = new FileInputStream(pluginsProperties);) { props.load(stream); } catch (FileNotFoundException ex) { - throw new IOException(bundleHelper. - getMessage("err.path.not.valid") - + " " + pluginsProperties); + throw new IOException(bundleHelper.getMessage("err.path.not.valid", pluginsProperties)); } } for (Entry> entry : plugins.entrySet()) { @@ -588,6 +590,8 @@ : ImagePluginProviderRepository.getImageBuilderProviders(getPluginsLayer())) { log.println("\n" + bundleHelper.getMessage("main.image.builder.name") + ": " + prov.getName()); + log.println(bundleHelper.getMessage("main.image.builder.description") + + ": " + prov.getDescription()); logBuilderOptions(prov.getOptions()); } } @@ -675,9 +679,8 @@ = new FileInputStream(pluginOptions.pluginsProperties)) { props.load(fis); } catch (FileNotFoundException ex) { - throw new IOException(bundleHelper. - getMessage("err.path.not.valid") - + " " + pluginOptions.pluginsProperties); + throw new IOException(bundleHelper.getMessage("err.path.not.valid", + pluginOptions.pluginsProperties)); } StringBuilder sb = new StringBuilder(); for (String str : props.stringPropertyNames()) { @@ -789,6 +792,21 @@ return arguments; } + private static void checkExportedPackages(Set modules) { + Map packageToModule = new HashMap<>(); + for (ModuleReference module : modules) { + for (String pack: module.descriptor().packages()) { + ModuleReference other = packageToModule.putIfAbsent(pack, module); + if (other != null) { + String module1 = module.descriptor().name(); + String module2 = other.descriptor().name(); + throw new ResolutionException("Modules " + + module1 + " and " + module2 + " both contain package " + pack); + } + } + } + } + static Layer createPluginsLayer(Path[] paths) { ModuleFinder finder = ModuleFinder.of(paths); @@ -799,6 +817,7 @@ Configuration cf = Configuration.resolve(ModuleFinder.empty(), Layer.boot(), finder); cf = cf.bind(); + checkExportedPackages(cf.modules()); // The creation of this classloader is done outside privileged block in purpose // If a security manager is set, then permission must be granted to jlink // codebase to create a classloader. This is the expected behavior.