< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java

Print this page




  57 import java.nio.file.SimpleFileVisitor;
  58 import java.nio.file.StandardCopyOption;
  59 import java.nio.file.attribute.BasicFileAttributes;
  60 import java.text.MessageFormat;
  61 import java.util.ArrayDeque;
  62 import java.util.ArrayList;
  63 import java.util.Collection;
  64 import java.util.Collections;
  65 import java.util.Comparator;
  66 import java.util.Deque;
  67 import java.util.HashMap;
  68 import java.util.HashSet;
  69 import java.util.LinkedHashMap;
  70 import java.util.List;
  71 import java.util.Locale;
  72 import java.util.Map;
  73 import java.util.MissingResourceException;
  74 import java.util.Optional;
  75 import java.util.ResourceBundle;
  76 import java.util.Set;

  77 import java.util.function.Consumer;
  78 import java.util.function.Function;
  79 import java.util.function.Predicate;
  80 import java.util.function.Supplier;
  81 import java.util.jar.JarEntry;
  82 import java.util.jar.JarFile;
  83 import java.util.jar.JarOutputStream;
  84 import java.util.stream.Collectors;
  85 import java.util.regex.Pattern;
  86 import java.util.regex.PatternSyntaxException;
  87 import java.util.zip.ZipEntry;
  88 import java.util.zip.ZipException;
  89 import java.util.zip.ZipFile;
  90 
  91 import jdk.internal.jmod.JmodFile;
  92 import jdk.internal.jmod.JmodFile.Section;
  93 import jdk.internal.joptsimple.BuiltinHelpFormatter;
  94 import jdk.internal.joptsimple.NonOptionArgumentSpec;
  95 import jdk.internal.joptsimple.OptionDescriptor;
  96 import jdk.internal.joptsimple.OptionException;


 480         void writeModuleInfo(JmodOutputStream out, Set<String> packages)
 481             throws IOException
 482         {
 483             Supplier<InputStream> miSupplier = newModuleInfoSupplier();
 484             if (miSupplier == null) {
 485                 throw new IOException(MODULE_INFO + " not found");
 486             }
 487 
 488             ModuleDescriptor descriptor;
 489             try (InputStream in = miSupplier.get()) {
 490                 descriptor = ModuleDescriptor.read(in);
 491             }
 492 
 493             // copy the module-info.class into the jmod with the additional
 494             // attributes for the version, main class and other meta data
 495             try (InputStream in = miSupplier.get()) {
 496                 ModuleInfoExtender extender = ModuleInfoExtender.newExtender(in);
 497 
 498                 // Add (or replace) the Packages attribute
 499                 if (packages != null) {

 500                     extender.packages(packages);
 501                 }
 502 
 503                 // --main-class
 504                 if (mainClass != null)
 505                     extender.mainClass(mainClass);
 506 
 507                 // --os-name, --os-arch, --os-version
 508                 if (osName != null || osArch != null || osVersion != null)
 509                     extender.targetPlatform(osName, osArch, osVersion);
 510 
 511                 // --module-version
 512                 if (moduleVersion != null)
 513                     extender.version(moduleVersion);
 514 
 515                 if (hasher != null) {
 516                     ModuleHashes moduleHashes = hasher.computeHashes(descriptor.name());
 517                     if (moduleHashes != null) {
 518                         extender.hashes(moduleHashes);
 519                     } else {
 520                         warning("warn.no.module.hashes", descriptor.name());
 521                     }
 522                 }
 523 
 524                 if (moduleResolution != null && moduleResolution.value() != 0) {
 525                     extender.moduleResolution(moduleResolution);
 526                 }
 527 
 528                 // write the (possibly extended or modified) module-info.class
 529                 out.writeEntry(extender.toByteArray(), Section.CLASSES, MODULE_INFO);
 530             }
 531         }
 532 


















 533         /*
 534          * Hasher resolves a module graph using the --hash-modules PATTERN
 535          * as the roots.
 536          *
 537          * The jmod file is being created and does not exist in the
 538          * given modulepath.
 539          */
 540         private Hasher hasher() {
 541             if (options.modulesToHash == null)
 542                 return null;
 543 
 544             try {
 545                 Supplier<InputStream> miSupplier = newModuleInfoSupplier();
 546                 if (miSupplier == null) {
 547                     throw new IOException(MODULE_INFO + " not found");
 548                 }
 549 
 550                 ModuleDescriptor descriptor;
 551                 try (InputStream in = miSupplier.get()) {
 552                     descriptor = ModuleDescriptor.read(in);




  57 import java.nio.file.SimpleFileVisitor;
  58 import java.nio.file.StandardCopyOption;
  59 import java.nio.file.attribute.BasicFileAttributes;
  60 import java.text.MessageFormat;
  61 import java.util.ArrayDeque;
  62 import java.util.ArrayList;
  63 import java.util.Collection;
  64 import java.util.Collections;
  65 import java.util.Comparator;
  66 import java.util.Deque;
  67 import java.util.HashMap;
  68 import java.util.HashSet;
  69 import java.util.LinkedHashMap;
  70 import java.util.List;
  71 import java.util.Locale;
  72 import java.util.Map;
  73 import java.util.MissingResourceException;
  74 import java.util.Optional;
  75 import java.util.ResourceBundle;
  76 import java.util.Set;
  77 import java.util.TreeSet;
  78 import java.util.function.Consumer;
  79 import java.util.function.Function;
  80 import java.util.function.Predicate;
  81 import java.util.function.Supplier;
  82 import java.util.jar.JarEntry;
  83 import java.util.jar.JarFile;
  84 import java.util.jar.JarOutputStream;
  85 import java.util.stream.Collectors;
  86 import java.util.regex.Pattern;
  87 import java.util.regex.PatternSyntaxException;
  88 import java.util.zip.ZipEntry;
  89 import java.util.zip.ZipException;
  90 import java.util.zip.ZipFile;
  91 
  92 import jdk.internal.jmod.JmodFile;
  93 import jdk.internal.jmod.JmodFile.Section;
  94 import jdk.internal.joptsimple.BuiltinHelpFormatter;
  95 import jdk.internal.joptsimple.NonOptionArgumentSpec;
  96 import jdk.internal.joptsimple.OptionDescriptor;
  97 import jdk.internal.joptsimple.OptionException;


 481         void writeModuleInfo(JmodOutputStream out, Set<String> packages)
 482             throws IOException
 483         {
 484             Supplier<InputStream> miSupplier = newModuleInfoSupplier();
 485             if (miSupplier == null) {
 486                 throw new IOException(MODULE_INFO + " not found");
 487             }
 488 
 489             ModuleDescriptor descriptor;
 490             try (InputStream in = miSupplier.get()) {
 491                 descriptor = ModuleDescriptor.read(in);
 492             }
 493 
 494             // copy the module-info.class into the jmod with the additional
 495             // attributes for the version, main class and other meta data
 496             try (InputStream in = miSupplier.get()) {
 497                 ModuleInfoExtender extender = ModuleInfoExtender.newExtender(in);
 498 
 499                 // Add (or replace) the Packages attribute
 500                 if (packages != null) {
 501                     validatePackages(descriptor, packages);
 502                     extender.packages(packages);
 503                 }
 504 
 505                 // --main-class
 506                 if (mainClass != null)
 507                     extender.mainClass(mainClass);
 508 
 509                 // --os-name, --os-arch, --os-version
 510                 if (osName != null || osArch != null || osVersion != null)
 511                     extender.targetPlatform(osName, osArch, osVersion);
 512 
 513                 // --module-version
 514                 if (moduleVersion != null)
 515                     extender.version(moduleVersion);
 516 
 517                 if (hasher != null) {
 518                     ModuleHashes moduleHashes = hasher.computeHashes(descriptor.name());
 519                     if (moduleHashes != null) {
 520                         extender.hashes(moduleHashes);
 521                     } else {
 522                         warning("warn.no.module.hashes", descriptor.name());
 523                     }
 524                 }
 525 
 526                 if (moduleResolution != null && moduleResolution.value() != 0) {
 527                     extender.moduleResolution(moduleResolution);
 528                 }
 529 
 530                 // write the (possibly extended or modified) module-info.class
 531                 out.writeEntry(extender.toByteArray(), Section.CLASSES, MODULE_INFO);
 532             }
 533         }
 534 
 535         private void validatePackages(ModuleDescriptor descriptor, Set<String> packages) {
 536             Set<String> nonExistPackages = new TreeSet<>();
 537             descriptor.exports().stream()
 538                 .map(Exports::source)
 539                 .filter(pn -> !packages.contains(pn))
 540                 .forEach(nonExistPackages::add);
 541 
 542             descriptor.opens().stream()
 543                 .map(Opens::source)
 544                 .filter(pn -> !packages.contains(pn))
 545                 .forEach(nonExistPackages::add);
 546 
 547             if (!nonExistPackages.isEmpty()) {
 548                 throw new CommandException("err.missing.export.or.open.packages",
 549                     descriptor.name(), nonExistPackages);
 550             }
 551         }
 552 
 553         /*
 554          * Hasher resolves a module graph using the --hash-modules PATTERN
 555          * as the roots.
 556          *
 557          * The jmod file is being created and does not exist in the
 558          * given modulepath.
 559          */
 560         private Hasher hasher() {
 561             if (options.modulesToHash == null)
 562                 return null;
 563 
 564             try {
 565                 Supplier<InputStream> miSupplier = newModuleInfoSupplier();
 566                 if (miSupplier == null) {
 567                     throw new IOException(MODULE_INFO + " not found");
 568                 }
 569 
 570                 ModuleDescriptor descriptor;
 571                 try (InputStream in = miSupplier.get()) {
 572                     descriptor = ModuleDescriptor.read(in);


< prev index next >