1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugin.compiler;
20
21 import java.util.ArrayList;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Set;
25
26 import org.apache.maven.plugin.logging.Log;
27 import org.objectweb.asm.ClassReader;
28 import org.objectweb.asm.ClassVisitor;
29 import org.objectweb.asm.ClassWriter;
30 import org.objectweb.asm.ModuleVisitor;
31 import org.objectweb.asm.Opcodes;
32
33
34
35
36
37
38 final class ModuleInfoTransformer {
39
40 private ModuleInfoTransformer() {}
41
42 static byte[] transform(byte[] originalBytecode, String javaVersion, Log log) {
43 List<String> modulesModified = new ArrayList<>();
44 Set<String> foundVersions = new HashSet<>();
45 ClassReader reader = new ClassReader(originalBytecode);
46 ClassWriter writer = new ClassWriter(0);
47
48 ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM9, writer) {
49 @Override
50 public ModuleVisitor visitModule(String name, int access, String version) {
51 ModuleVisitor originalModuleVisitor = super.visitModule(name, access, version);
52 return new ModuleVisitor(Opcodes.ASM9, originalModuleVisitor) {
53 @Override
54 public void visitRequire(String module, int access, String version) {
55
56 if (version != null && (module.startsWith("java.") || module.startsWith("jdk."))) {
57
58
59 super.visitRequire(module, access, javaVersion);
60 foundVersions.add(version);
61 modulesModified.add(module);
62 } else {
63
64 super.visitRequire(module, access, version);
65 }
66 }
67 };
68 }
69 };
70
71 reader.accept(classVisitor, 0);
72
73 if (modulesModified.isEmpty()) {
74 return null;
75 }
76
77 log.info(String.format(
78 "JDK-8318913 workaround: patched module-info.class requires version from %s to [%s] on %d JDK modules %s",
79 foundVersions, javaVersion, modulesModified.size(), modulesModified));
80
81 return writer.toByteArray();
82 }
83 }