< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/TaskHelper.java

Print this page

        

@@ -28,11 +28,14 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 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;
 import java.text.MessageFormat;
 import java.util.ArrayList;

@@ -42,10 +45,11 @@
 import java.util.Map;
 import java.util.Map.Entry;
 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;
 import jdk.tools.jlink.internal.ImagePluginProviderRepository;
 import jdk.tools.jlink.internal.ImagePluginConfiguration;

@@ -283,13 +287,11 @@
             if (pluginsProperties != null) {
                 try (FileInputStream stream
                         = 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<PluginProvider, Map<String, String>> entry : plugins.entrySet()) {
                 PluginProvider provider = entry.getKey();
                 ImagePluginConfiguration.addPluginProperty(props, provider);

@@ -586,10 +588,12 @@
                 log.println(bundleHelper.getMessage("main.image.builders"));
                 for (ImageBuilderProvider prov
                         : 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());
                 }
             }
         }
 

@@ -673,13 +677,12 @@
                 Properties props = new Properties();
                 try (FileInputStream fis
                         = 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()) {
                     sb.append(str).append(" = ").append(props.getProperty(str)).
                             append("\n");

@@ -787,20 +790,36 @@
             defaults = remaining;
         }
         return arguments;
     }
 
+    private static void checkExportedPackages(Set<ModuleReference> modules) {
+        Map<String, ModuleReference> 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);
 
         // jmods are located at link-time
         if (finder instanceof ConfigurableModuleFinder)
             ((ConfigurableModuleFinder)finder).configurePhase(Phase.LINK_TIME);
 
         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.
         ClassLoader cl = new ModuleClassLoader(cf);
         return Layer.create(cf, mn -> cl);
< prev index next >