< 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 >