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