67 // JAR file name module-name[/version] |
65 // JAR file name module-name[/version] |
68 |
66 |
69 { "foo.jar", "foo" }, |
67 { "foo.jar", "foo" }, |
70 { "foo4j.jar", "foo4j", }, |
68 { "foo4j.jar", "foo4j", }, |
71 |
69 |
72 { "foo1.jar", "foo" }, |
70 { "foo1.jar", "foo1" }, |
73 { "foo1.2.jar", "foo" }, |
71 { "foo10.jar", "foo10" }, |
74 { "foo1.2.3.jar", "foo" }, |
|
75 |
|
76 { "foo10.jar", "foo" }, |
|
77 { "foo10.20.jar", "foo" }, |
|
78 { "foo10.20.30.jar", "foo" }, |
|
79 |
72 |
80 { "foo-1.jar", "foo/1" }, |
73 { "foo-1.jar", "foo/1" }, |
81 { "foo-1.2.jar", "foo/1.2" }, |
74 { "foo-1.2.jar", "foo/1.2" }, |
82 { "foo-1.2.3.jar", "foo/1.2.3" }, |
75 { "foo-1.2.3.jar", "foo/1.2.3" }, |
83 { "foo-1.2.3.4.jar", "foo/1.2.3.4" }, |
76 { "foo-1.2.3.4.jar", "foo/1.2.3.4" }, |
91 { "foo-bar-1.jar", "foo.bar/1" }, |
84 { "foo-bar-1.jar", "foo.bar/1" }, |
92 { "foo-bar-1.2.jar", "foo.bar/1.2"}, |
85 { "foo-bar-1.2.jar", "foo.bar/1.2"}, |
93 { "foo-bar-10.jar", "foo.bar/10" }, |
86 { "foo-bar-10.jar", "foo.bar/10" }, |
94 { "foo-bar-10.20.jar", "foo.bar/10.20" }, |
87 { "foo-bar-10.20.jar", "foo.bar/10.20" }, |
95 |
88 |
|
89 { "foo.bar1.jar", "foo.bar1" }, |
|
90 { "foo.bar10.jar", "foo.bar10" }, |
|
91 |
96 { "foo-1.2-SNAPSHOT.jar", "foo/1.2-SNAPSHOT" }, |
92 { "foo-1.2-SNAPSHOT.jar", "foo/1.2-SNAPSHOT" }, |
97 { "foo-bar-1.2-SNAPSHOT.jar", "foo.bar/1.2-SNAPSHOT" }, |
93 { "foo-bar-1.2-SNAPSHOT.jar", "foo.bar/1.2-SNAPSHOT" }, |
98 |
94 |
99 { "foo--bar-1.0.jar", "foo.bar/1.0" }, |
95 { "foo--bar-1.0.jar", "foo.bar/1.0" }, |
100 { "-foo-bar-1.0.jar", "foo.bar/1.0" }, |
96 { "-foo-bar-1.0.jar", "foo.bar/1.0" }, |
467 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
467 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
468 createDummyJarFile(dir.resolve("b.jar"), "p/T.class"); |
468 createDummyJarFile(dir.resolve("b.jar"), "p/T.class"); |
469 createDummyJarFile(dir.resolve("c.jar"), "q/T.class"); |
469 createDummyJarFile(dir.resolve("c.jar"), "q/T.class"); |
470 |
470 |
471 // module finder locates a and the modules in the directory |
471 // module finder locates a and the modules in the directory |
472 ModuleFinder finder |
472 ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); |
473 = ModuleFinder.compose(ModuleUtils.finderOf(descriptor1), |
473 ModuleFinder finder2 = ModuleFinder.of(dir); |
474 ModuleFinder.of(dir)); |
474 ModuleFinder finder = ModuleFinder.compose(finder1, finder2); |
475 |
475 |
476 Configuration parent = Layer.boot().configuration(); |
476 Configuration parent = ModuleLayer.boot().configuration(); |
477 Configuration cf = resolve(parent, finder, "a"); |
477 Configuration cf = resolve(parent, finder, "a"); |
478 |
478 |
479 assertTrue(cf.modules().size() == 3); |
479 assertTrue(cf.modules().size() == 3); |
480 assertTrue(cf.findModule("a").isPresent()); |
480 assertTrue(cf.findModule("a").isPresent()); |
481 assertTrue(cf.findModule("b").isPresent()); |
481 assertTrue(cf.findModule("b").isPresent()); |
482 assertTrue(cf.findModule("c").isPresent()); |
482 assertTrue(cf.findModule("c").isPresent()); |
483 |
483 |
484 ResolvedModule base = cf.findModule("java.base").get(); |
484 ResolvedModule base = cf.findModule("java.base").get(); |
485 assertTrue(base.configuration() == Layer.boot().configuration()); |
485 assertTrue(base.configuration() == ModuleLayer.boot().configuration()); |
486 ResolvedModule a = cf.findModule("a").get(); |
486 ResolvedModule a = cf.findModule("a").get(); |
487 ResolvedModule b = cf.findModule("b").get(); |
487 ResolvedModule b = cf.findModule("b").get(); |
488 ResolvedModule c = cf.findModule("c").get(); |
488 ResolvedModule c = cf.findModule("c").get(); |
489 |
489 |
490 // b && c only require java.base |
490 // b && c only require java.base |
605 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
605 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
606 createDummyJarFile(dir.resolve("c.jar"), "p/T.class"); |
606 createDummyJarFile(dir.resolve("c.jar"), "p/T.class"); |
607 createDummyJarFile(dir.resolve("d.jar"), "q/T.class"); |
607 createDummyJarFile(dir.resolve("d.jar"), "q/T.class"); |
608 |
608 |
609 // module finder locates a and the modules in the directory |
609 // module finder locates a and the modules in the directory |
610 ModuleFinder finder |
610 ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); |
611 = ModuleFinder.compose(ModuleUtils.finderOf(descriptor1, descriptor2), |
611 ModuleFinder finder2 = ModuleFinder.of(dir); |
612 ModuleFinder.of(dir)); |
612 ModuleFinder finder = ModuleFinder.compose(finder1, finder2); |
613 |
613 |
614 Configuration parent = Layer.boot().configuration(); |
614 Configuration parent = ModuleLayer.boot().configuration(); |
615 Configuration cf = resolve(parent, finder, "a", "d"); |
615 Configuration cf = resolve(parent, finder, "a", "d"); |
616 |
616 |
617 assertTrue(cf.modules().size() == 4); |
617 assertTrue(cf.modules().size() == 4); |
618 assertTrue(cf.findModule("a").isPresent()); |
618 assertTrue(cf.findModule("a").isPresent()); |
619 assertTrue(cf.findModule("b").isPresent()); |
619 assertTrue(cf.findModule("b").isPresent()); |
620 assertTrue(cf.findModule("c").isPresent()); |
620 assertTrue(cf.findModule("c").isPresent()); |
621 assertTrue(cf.findModule("d").isPresent()); |
621 assertTrue(cf.findModule("d").isPresent()); |
622 |
622 |
623 ResolvedModule base = cf.findModule("java.base").get(); |
623 ResolvedModule base = cf.findModule("java.base").get(); |
624 assertTrue(base.configuration() == Layer.boot().configuration()); |
624 assertTrue(base.configuration() == ModuleLayer.boot().configuration()); |
625 ResolvedModule a = cf.findModule("a").get(); |
625 ResolvedModule a = cf.findModule("a").get(); |
626 ResolvedModule b = cf.findModule("b").get(); |
626 ResolvedModule b = cf.findModule("b").get(); |
627 ResolvedModule c = cf.findModule("c").get(); |
627 ResolvedModule c = cf.findModule("c").get(); |
628 ResolvedModule d = cf.findModule("d").get(); |
628 ResolvedModule d = cf.findModule("d").get(); |
629 |
629 |
655 |
655 |
656 assertTrue(d.reads().contains(a)); |
656 assertTrue(d.reads().contains(a)); |
657 assertTrue(d.reads().contains(b)); |
657 assertTrue(d.reads().contains(b)); |
658 assertTrue(d.reads().contains(c)); |
658 assertTrue(d.reads().contains(c)); |
659 testReadAllBootModules(cf, "d"); // d reads all modules in boot layer |
659 testReadAllBootModules(cf, "d"); // d reads all modules in boot layer |
|
660 } |
|
661 |
|
662 |
|
663 /** |
|
664 * Basic test to ensure that no automatic modules are resolved when |
|
665 * an automatic module is not a root or required by other modules. |
|
666 */ |
|
667 public void testInConfiguration4() throws IOException { |
|
668 ModuleDescriptor descriptor1 |
|
669 = ModuleDescriptor.newModule("m1") |
|
670 .requires("java.base") |
|
671 .build(); |
|
672 |
|
673 // automatic modules |
|
674 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
|
675 createDummyJarFile(dir.resolve("auto1.jar"), "p1/C.class"); |
|
676 createDummyJarFile(dir.resolve("auto2.jar"), "p2/C.class"); |
|
677 createDummyJarFile(dir.resolve("auto3.jar"), "p3/C.class"); |
|
678 |
|
679 // module finder locates m1 and the modules in the directory |
|
680 ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); |
|
681 ModuleFinder finder2 = ModuleFinder.of(dir); |
|
682 ModuleFinder finder = ModuleFinder.compose(finder1, finder2); |
|
683 |
|
684 Configuration parent = ModuleLayer.boot().configuration(); |
|
685 Configuration cf = resolve(parent, finder, "m1"); |
|
686 |
|
687 // ensure that no automatic module is resolved |
|
688 assertTrue(cf.modules().size() == 1); |
|
689 assertTrue(cf.findModule("m1").isPresent()); |
|
690 } |
|
691 |
|
692 |
|
693 /** |
|
694 * Basic test to ensure that if an automatic module is resolved then |
|
695 * all observable automatic modules are resolved. |
|
696 */ |
|
697 public void testInConfiguration5() throws IOException { |
|
698 // m1 requires m2 |
|
699 ModuleDescriptor descriptor1 |
|
700 = ModuleDescriptor.newModule("m1") |
|
701 .requires("m2").build(); |
|
702 |
|
703 // m2 requires automatic module |
|
704 ModuleDescriptor descriptor2 |
|
705 = ModuleDescriptor.newModule("m2") |
|
706 .requires("auto1") |
|
707 .build(); |
|
708 |
|
709 // automatic modules |
|
710 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
|
711 createDummyJarFile(dir.resolve("auto1.jar"), "p1/C.class"); |
|
712 createDummyJarFile(dir.resolve("auto2.jar"), "p2/C.class"); |
|
713 createDummyJarFile(dir.resolve("auto3.jar"), "p3/C.class"); |
|
714 |
|
715 // module finder locates m1, m2, and the modules in the directory |
|
716 ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); |
|
717 ModuleFinder finder2 = ModuleFinder.of(dir); |
|
718 ModuleFinder finder = ModuleFinder.compose(finder1, finder2); |
|
719 |
|
720 Configuration parent = ModuleLayer.boot().configuration(); |
|
721 Configuration cf = resolve(parent, finder, "m1"); |
|
722 |
|
723 // all automatic modules should be resolved |
|
724 assertTrue(cf.modules().size() == 5); |
|
725 assertTrue(cf.findModule("m1").isPresent()); |
|
726 assertTrue(cf.findModule("m2").isPresent()); |
|
727 assertTrue(cf.findModule("auto1").isPresent()); |
|
728 assertTrue(cf.findModule("auto2").isPresent()); |
|
729 assertTrue(cf.findModule("auto3").isPresent()); |
|
730 |
|
731 ResolvedModule base = parent.findModule("java.base") |
|
732 .orElseThrow(() -> new RuntimeException()); |
|
733 ResolvedModule m1 = cf.findModule("m1").get(); |
|
734 ResolvedModule m2 = cf.findModule("m2").get(); |
|
735 ResolvedModule auto1 = cf.findModule("auto1").get(); |
|
736 ResolvedModule auto2 = cf.findModule("auto2").get(); |
|
737 ResolvedModule auto3 = cf.findModule("auto3").get(); |
|
738 |
|
739 // m1 does not read the automatic modules |
|
740 assertTrue(m1.reads().size() == 2); |
|
741 assertTrue(m1.reads().contains(m2)); |
|
742 assertTrue(m1.reads().contains(base)); |
|
743 |
|
744 // m2 should read all the automatic modules |
|
745 assertTrue(m2.reads().size() == 4); |
|
746 assertTrue(m2.reads().contains(auto1)); |
|
747 assertTrue(m2.reads().contains(auto2)); |
|
748 assertTrue(m2.reads().contains(auto3)); |
|
749 assertTrue(m2.reads().contains(base)); |
|
750 |
|
751 assertTrue(auto1.reads().contains(m1)); |
|
752 assertTrue(auto1.reads().contains(m2)); |
|
753 assertTrue(auto1.reads().contains(auto2)); |
|
754 assertTrue(auto1.reads().contains(auto3)); |
|
755 assertTrue(auto1.reads().contains(base)); |
|
756 |
|
757 assertTrue(auto2.reads().contains(m1)); |
|
758 assertTrue(auto2.reads().contains(m2)); |
|
759 assertTrue(auto2.reads().contains(auto1)); |
|
760 assertTrue(auto2.reads().contains(auto3)); |
|
761 assertTrue(auto2.reads().contains(base)); |
|
762 |
|
763 assertTrue(auto3.reads().contains(m1)); |
|
764 assertTrue(auto3.reads().contains(m2)); |
|
765 assertTrue(auto3.reads().contains(auto1)); |
|
766 assertTrue(auto3.reads().contains(auto2)); |
|
767 assertTrue(auto3.reads().contains(base)); |
|
768 } |
|
769 |
|
770 |
|
771 /** |
|
772 * Basic test of automatic modules in a child configuration. All automatic |
|
773 * modules that are found with the before finder should be resolved. The |
|
774 * automatic modules that are found by the after finder and not shadowed |
|
775 * by the before finder, or parent configurations, should also be resolved. |
|
776 */ |
|
777 public void testInConfiguration6() throws IOException { |
|
778 // m1 requires auto1 |
|
779 ModuleDescriptor descriptor1 |
|
780 = ModuleDescriptor.newModule("m1") |
|
781 .requires("auto1") |
|
782 .build(); |
|
783 |
|
784 Path dir = Files.createTempDirectory(USER_DIR, "mods"); |
|
785 createDummyJarFile(dir.resolve("auto1.jar"), "p1/C.class"); |
|
786 |
|
787 // module finder locates m1 and auto1 |
|
788 ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); |
|
789 ModuleFinder finder2 = ModuleFinder.of(dir); |
|
790 ModuleFinder finder = ModuleFinder.compose(finder1, finder2); |
|
791 |
|
792 Configuration parent = ModuleLayer.boot().configuration(); |
|
793 Configuration cf1 = resolve(parent, finder, "m1"); |
|
794 |
|
795 assertTrue(cf1.modules().size() == 2); |
|
796 assertTrue(cf1.findModule("m1").isPresent()); |
|
797 assertTrue(cf1.findModule("auto1").isPresent()); |
|
798 |
|
799 ResolvedModule base = parent.findModule("java.base") |
|
800 .orElseThrow(() -> new RuntimeException()); |
|
801 ResolvedModule m1 = cf1.findModule("m1").get(); |
|
802 ResolvedModule auto1 = cf1.findModule("auto1").get(); |
|
803 |
|
804 assertTrue(m1.reads().size() == 2); |
|
805 assertTrue(m1.reads().contains(auto1)); |
|
806 assertTrue(m1.reads().contains(base)); |
|
807 |
|
808 assertTrue(auto1.reads().contains(m1)); |
|
809 assertTrue(auto1.reads().contains(base)); |
|
810 |
|
811 |
|
812 // create child configuration - the after finder locates auto1 |
|
813 |
|
814 dir = Files.createTempDirectory(USER_DIR, "mods"); |
|
815 createDummyJarFile(dir.resolve("auto2.jar"), "p2/C.class"); |
|
816 ModuleFinder beforeFinder = ModuleFinder.of(dir); |
|
817 |
|
818 dir = Files.createTempDirectory(USER_DIR, "mods"); |
|
819 createDummyJarFile(dir.resolve("auto1.jar"), "p1/C.class"); |
|
820 createDummyJarFile(dir.resolve("auto2.jar"), "p2/C.class"); |
|
821 createDummyJarFile(dir.resolve("auto3.jar"), "p3/C.class"); |
|
822 ModuleFinder afterFinder = ModuleFinder.of(dir); |
|
823 |
|
824 Configuration cf2 = cf1.resolve(beforeFinder, afterFinder, Set.of("auto2")); |
|
825 |
|
826 // auto1 should be found in parent and should not be in cf2 |
|
827 assertTrue(cf2.modules().size() == 2); |
|
828 assertTrue(cf2.findModule("auto2").isPresent()); |
|
829 assertTrue(cf2.findModule("auto3").isPresent()); |
|
830 |
|
831 ResolvedModule auto2 = cf2.findModule("auto2").get(); |
|
832 ResolvedModule auto3 = cf2.findModule("auto3").get(); |
|
833 |
|
834 assertTrue(auto2.reads().contains(m1)); |
|
835 assertTrue(auto2.reads().contains(auto1)); |
|
836 assertTrue(auto2.reads().contains(auto3)); |
|
837 assertTrue(auto2.reads().contains(base)); |
|
838 |
|
839 assertTrue(auto3.reads().contains(m1)); |
|
840 assertTrue(auto3.reads().contains(auto1)); |
|
841 assertTrue(auto3.reads().contains(auto2)); |
|
842 assertTrue(auto3.reads().contains(base)); |
660 } |
843 } |
661 |
844 |
662 |
845 |
663 /** |
846 /** |
664 * Basic test of a configuration created with automatic modules |
847 * Basic test of a configuration created with automatic modules |