--- old/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java 2016-12-21 17:34:54.000000000 +0530 +++ new/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java 2016-12-21 17:34:53.000000000 +0530 @@ -74,6 +74,7 @@ import java.util.Optional; import java.util.ResourceBundle; import java.util.Set; +import java.util.TreeSet; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -497,6 +498,7 @@ // Add (or replace) the Packages attribute if (packages != null) { + validatePackages(descriptor, packages); extender.packages(packages); } @@ -530,6 +532,24 @@ } } + private void validatePackages(ModuleDescriptor descriptor, Set packages) { + Set nonExistPackages = new TreeSet<>(); + descriptor.exports().stream() + .map(Exports::source) + .filter(pn -> !packages.contains(pn)) + .forEach(nonExistPackages::add); + + descriptor.opens().stream() + .map(Opens::source) + .filter(pn -> !packages.contains(pn)) + .forEach(nonExistPackages::add); + + if (!nonExistPackages.isEmpty()) { + throw new CommandException("err.missing.export.or.open.packages", + descriptor.name(), nonExistPackages); + } + } + /* * Hasher resolves a module graph using the --hash-modules PATTERN * as the roots.