35 * jdk.zipfs 36 * @build jdk.test.lib.Utils 37 * jdk.test.lib.Asserts 38 * jdk.test.lib.JDKToolFinder 39 * jdk.test.lib.JDKToolLauncher 40 * jdk.test.lib.Platform 41 * jdk.test.lib.process.* 42 * @run testng JLinkMultiReleaseJarTest 43 */ 44 45 import java.io.ByteArrayInputStream; 46 import java.io.IOException; 47 import java.lang.invoke.MethodHandle; 48 import java.lang.invoke.MethodHandles; 49 import java.lang.invoke.MethodType; 50 import java.lang.module.ModuleDescriptor; 51 import java.nio.file.Files; 52 import java.nio.file.Path; 53 import java.nio.file.Paths; 54 import java.nio.file.StandardCopyOption; 55 import java.util.Arrays; 56 import java.util.Set; 57 import java.util.jar.JarFile; 58 import java.util.spi.ToolProvider; 59 import java.util.stream.Collectors; 60 import java.util.stream.Stream; 61 62 import jdk.internal.jimage.BasicImageReader; 63 import jdk.test.lib.process.ProcessTools; 64 import jdk.test.lib.process.OutputAnalyzer; 65 66 import org.testng.Assert; 67 import org.testng.annotations.BeforeClass; 68 import org.testng.annotations.Test; 69 70 public class JLinkMultiReleaseJarTest { 71 private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar") 72 .orElseThrow(() -> new RuntimeException("jar tool not found")); 73 private static final ToolProvider JAVAC_TOOL = ToolProvider.findFirst("javac") 74 .orElseThrow(() -> new RuntimeException("javac tool not found")); 75 private static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink") 117 118 // now move the module-info that requires logging to temporary place 119 Files.move(rtmods.resolve("m1").resolve("module-info.class"), 120 userdir.resolve("module-info.class")); 121 122 // and build another jar 123 args[1] = "m1-no-logging.jar"; 124 JAR_TOOL.run(System.out, System.err, args); 125 126 // replace the no logging module-info with the logging module-info 127 Files.move(userdir.resolve("module-info.class"), 128 basemods.resolve("m1").resolve("module-info.class"), 129 StandardCopyOption.REPLACE_EXISTING); 130 131 // and build another jar 132 args[1] = "m1-logging.jar"; 133 JAR_TOOL.run(System.out, System.err, args); 134 } 135 136 private void javac(Path source, Path destination, String srcpath) throws IOException { 137 String[] args = Stream.concat( 138 Stream.of("-d", destination.toString(), "--module-source-path", srcpath), 139 Files.walk(source) 140 .map(Path::toString) 141 .filter(s -> s.endsWith(".java")) 142 ).toArray(String[]::new); 143 int rc = JAVAC_TOOL.run(System.out, System.err, args); 144 Assert.assertEquals(rc, 0); 145 } 146 147 @Test 148 public void basicTest() throws Throwable { 149 if (ignoreTest()) return; 150 151 // use jlink to build image from multi-release jar 152 jlink("m1.jar", "myimage"); 153 154 // validate image 155 Path jimage = userdir.resolve("myimage").resolve("lib").resolve("modules"); 156 try (BasicImageReader reader = BasicImageReader.open(jimage)) { 157 158 // do we have the right entry names? 159 Set<String> names = Arrays.stream(reader.getEntryNames()) 160 .filter(n -> n.startsWith("/m1")) 161 .collect(Collectors.toSet()); 162 Assert.assertEquals(names, Set.of( 163 "/m1/module-info.class", | 35 * jdk.zipfs 36 * @build jdk.test.lib.Utils 37 * jdk.test.lib.Asserts 38 * jdk.test.lib.JDKToolFinder 39 * jdk.test.lib.JDKToolLauncher 40 * jdk.test.lib.Platform 41 * jdk.test.lib.process.* 42 * @run testng JLinkMultiReleaseJarTest 43 */ 44 45 import java.io.ByteArrayInputStream; 46 import java.io.IOException; 47 import java.lang.invoke.MethodHandle; 48 import java.lang.invoke.MethodHandles; 49 import java.lang.invoke.MethodType; 50 import java.lang.module.ModuleDescriptor; 51 import java.nio.file.Files; 52 import java.nio.file.Path; 53 import java.nio.file.Paths; 54 import java.nio.file.StandardCopyOption; 55 import java.util.ArrayList; 56 import java.util.Arrays; 57 import java.util.List; 58 import java.util.Set; 59 import java.util.jar.JarFile; 60 import java.util.spi.ToolProvider; 61 import java.util.stream.Collectors; 62 import java.util.stream.Stream; 63 64 import jdk.internal.jimage.BasicImageReader; 65 import jdk.test.lib.process.ProcessTools; 66 import jdk.test.lib.process.OutputAnalyzer; 67 68 import org.testng.Assert; 69 import org.testng.annotations.BeforeClass; 70 import org.testng.annotations.Test; 71 72 public class JLinkMultiReleaseJarTest { 73 private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar") 74 .orElseThrow(() -> new RuntimeException("jar tool not found")); 75 private static final ToolProvider JAVAC_TOOL = ToolProvider.findFirst("javac") 76 .orElseThrow(() -> new RuntimeException("javac tool not found")); 77 private static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink") 119 120 // now move the module-info that requires logging to temporary place 121 Files.move(rtmods.resolve("m1").resolve("module-info.class"), 122 userdir.resolve("module-info.class")); 123 124 // and build another jar 125 args[1] = "m1-no-logging.jar"; 126 JAR_TOOL.run(System.out, System.err, args); 127 128 // replace the no logging module-info with the logging module-info 129 Files.move(userdir.resolve("module-info.class"), 130 basemods.resolve("m1").resolve("module-info.class"), 131 StandardCopyOption.REPLACE_EXISTING); 132 133 // and build another jar 134 args[1] = "m1-logging.jar"; 135 JAR_TOOL.run(System.out, System.err, args); 136 } 137 138 private void javac(Path source, Path destination, String srcpath) throws IOException { 139 List<String> args = new ArrayList<>(List.of("-d", destination.toString(), "--module-source-path", srcpath)); 140 try (Stream<Path> pathStream = Files.walk(source)) { 141 List<String> javaFiles = pathStream 142 .map(Path::toString) 143 .filter(s -> s.endsWith(".java")) 144 .collect(Collectors.toList()); 145 args.addAll(javaFiles); 146 } 147 148 int rc = JAVAC_TOOL.run(System.out, System.err, args.toArray(new String[0])); 149 Assert.assertEquals(rc, 0); 150 } 151 152 @Test 153 public void basicTest() throws Throwable { 154 if (ignoreTest()) return; 155 156 // use jlink to build image from multi-release jar 157 jlink("m1.jar", "myimage"); 158 159 // validate image 160 Path jimage = userdir.resolve("myimage").resolve("lib").resolve("modules"); 161 try (BasicImageReader reader = BasicImageReader.open(jimage)) { 162 163 // do we have the right entry names? 164 Set<String> names = Arrays.stream(reader.getEntryNames()) 165 .filter(n -> n.startsWith("/m1")) 166 .collect(Collectors.toSet()); 167 Assert.assertEquals(names, Set.of( 168 "/m1/module-info.class", |