From df7529b1a18d909cd5874d33628f1715ef7d4604 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Mon, 25 Nov 2024 15:23:47 +0200 Subject: [PATCH] remove unneeded module info plugin --- buildSrc/build.gradle | 21 --- .../javamodules/ExtraModuleInfoPlugin.java | 54 ------ .../ExtraModuleInfoPluginExtension.java | 52 ------ .../javamodules/ExtraModuleInfoTransform.java | 164 ------------------ .../transform/javamodules/ModuleInfo.java | 53 ------ 5 files changed, 344 deletions(-) delete mode 100644 buildSrc/build.gradle delete mode 100644 buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java delete mode 100644 buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java delete mode 100644 buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java delete mode 100644 buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle deleted file mode 100644 index ebb5470..0000000 --- a/buildSrc/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - id 'java-gradle-plugin' // so we can assign and ID to our plugin -} - -dependencies { - implementation 'org.ow2.asm:asm:8.0.1' -} - -repositories { - mavenCentral() -} - -gradlePlugin { - plugins { - // here we register our plugin with an ID - register("extra-java-module-info") { - id = "extra-java-module-info" - implementationClass = "org.gradle.sample.transform.javamodules.ExtraModuleInfoPlugin" - } - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java deleted file mode 100644 index 48d0b0b..0000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.gradle.sample.transform.javamodules; - -import org.gradle.api.Plugin; -import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.attributes.Attribute; -import org.gradle.api.plugins.JavaPlugin; - -/** - * Entry point of our plugin that should be applied in the root project. - */ -public class ExtraModuleInfoPlugin implements Plugin { - - @Override - public void apply(Project project) { - // register the plugin extension as 'extraJavaModuleInfo {}' configuration block - ExtraModuleInfoPluginExtension extension = project.getObjects().newInstance(ExtraModuleInfoPluginExtension.class); - project.getExtensions().add(ExtraModuleInfoPluginExtension.class, "extraJavaModuleInfo", extension); - - // setup the transform for all projects in the build - project.getPlugins().withType(JavaPlugin.class).configureEach(javaPlugin -> configureTransform(project, extension)); - } - - private void configureTransform(Project project, ExtraModuleInfoPluginExtension extension) { - Attribute artifactType = Attribute.of("artifactType", String.class); - Attribute javaModule = Attribute.of("javaModule", Boolean.class); - - // compile and runtime classpath express that they only accept modules by requesting the javaModule=true attribute - project.getConfigurations().matching(this::isResolvingJavaPluginConfiguration).all( - c -> c.getAttributes().attribute(javaModule, true)); - - // all Jars have a javaModule=false attribute by default; the transform also recognizes modules and returns them without modification - project.getDependencies().getArtifactTypes().getByName("jar").getAttributes().attribute(javaModule, false); - - // register the transform for Jars and "javaModule=false -> javaModule=true"; the plugin extension object fills the input parameter - project.getDependencies().registerTransform(ExtraModuleInfoTransform.class, t -> { - t.parameters(p -> { - p.setModuleInfo(extension.getModuleInfo()); - p.setAutomaticModules(extension.getAutomaticModules()); - }); - t.getFrom().attribute(artifactType, "jar").attribute(javaModule, false); - t.getTo().attribute(artifactType, "jar").attribute(javaModule, true); - }); - } - - private boolean isResolvingJavaPluginConfiguration(Configuration configuration) { - if (!configuration.isCanBeResolved()) { - return false; - } - return configuration.getName().endsWith(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME.substring(1)) - || configuration.getName().endsWith(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME.substring(1)) - || configuration.getName().endsWith(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME.substring(1)); - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java deleted file mode 100644 index d0d4e0f..0000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.gradle.sample.transform.javamodules; - - -import org.gradle.api.Action; - -import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; - -/** - * A data class to collect all the module information we want to add. - * Here the class is used as extension that can be configured in the build script - * and as input to the ExtraModuleInfoTransform that add the information to Jars. - */ -public class ExtraModuleInfoPluginExtension { - - private final Map moduleInfo = new HashMap<>(); - private final Map automaticModules = new HashMap<>(); - - /** - * Add full module information for a given Jar file. - */ - public void module(String jarName, String moduleName, String moduleVersion) { - module(jarName, moduleName, moduleVersion, null); - } - - /** - * Add full module information, including exported packages and dependencies, for a given Jar file. - */ - public void module(String jarName, String moduleName, String moduleVersion, @Nullable Action conf) { - ModuleInfo moduleInfo = new ModuleInfo(moduleName, moduleVersion); - if (conf != null) { - conf.execute(moduleInfo); - } - this.moduleInfo.put(jarName, moduleInfo); - } - - /** - * Add only an automatic module name to a given jar file. - */ - public void automaticModule(String jarName, String moduleName) { - automaticModules.put(jarName, moduleName); - } - - protected Map getModuleInfo() { - return moduleInfo; - } - - protected Map getAutomaticModules() { - return automaticModules; - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java deleted file mode 100644 index 94e6922..0000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.gradle.sample.transform.javamodules; - -import org.gradle.api.artifacts.transform.InputArtifact; -import org.gradle.api.artifacts.transform.TransformAction; -import org.gradle.api.artifacts.transform.TransformOutputs; -import org.gradle.api.artifacts.transform.TransformParameters; -import org.gradle.api.file.FileSystemLocation; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.Input; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.ModuleVisitor; -import org.objectweb.asm.Opcodes; - -import java.io.*; -import java.util.Collections; -import java.util.Map; -import java.util.jar.*; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; - -/** - * An artifact transform that applies additional information to Jars without module information. - * The transformation fails the build if a Jar does not contain information and no extra information - * was defined for it. This way we make sure that all Jars are turned into modules. - */ -abstract public class ExtraModuleInfoTransform implements TransformAction { - - public static class Parameter implements TransformParameters, Serializable { - private Map moduleInfo = Collections.emptyMap(); - private Map automaticModules = Collections.emptyMap(); - - @Input - public Map getModuleInfo() { - return moduleInfo; - } - - @Input - public Map getAutomaticModules() { - return automaticModules; - } - - public void setModuleInfo(Map moduleInfo) { - this.moduleInfo = moduleInfo; - } - - public void setAutomaticModules(Map automaticModules) { - this.automaticModules = automaticModules; - } - } - - @InputArtifact - protected abstract Provider getInputArtifact(); - - @Override - public void transform(TransformOutputs outputs) { - Map moduleInfo = getParameters().moduleInfo; - Map automaticModules = getParameters().automaticModules; - File originalJar = getInputArtifact().get().getAsFile(); - String originalJarName = originalJar.getName(); - - if (isModule(originalJar)) { - outputs.file(originalJar); - } else if (moduleInfo.containsKey(originalJarName)) { - addModuleDescriptor(originalJar, getModuleJar(outputs, originalJar), moduleInfo.get(originalJarName)); - } else if (isAutoModule(originalJar)) { - outputs.file(originalJar); - } else if (automaticModules.containsKey(originalJarName)) { - addAutomaticModuleName(originalJar, getModuleJar(outputs, originalJar), automaticModules.get(originalJarName)); - } else { - throw new RuntimeException("Not a module and no mapping defined: " + originalJarName); - } - } - - private boolean isModule(File jar) { - Pattern moduleInfoClassMrjarPath = Pattern.compile("META-INF/versions/\\d+/module-info.class"); - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(jar))) { - boolean isMultiReleaseJar = containsMultiReleaseJarEntry(inputStream); - ZipEntry next = inputStream.getNextEntry(); - while (next != null) { - if ("module-info.class".equals(next.getName())) { - return true; - } - if (isMultiReleaseJar && moduleInfoClassMrjarPath.matcher(next.getName()).matches()) { - return true; - } - next = inputStream.getNextEntry(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return false; - } - - private boolean containsMultiReleaseJarEntry(JarInputStream jarStream) { - Manifest manifest = jarStream.getManifest(); - return manifest != null && Boolean.parseBoolean(manifest.getMainAttributes().getValue("Multi-Release")); - } - - private boolean isAutoModule(File jar) { - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(jar))) { - return inputStream.getManifest().getMainAttributes().getValue("Automatic-Module-Name") != null; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private File getModuleJar(TransformOutputs outputs, File originalJar) { - return outputs.file(originalJar.getName().substring(0, originalJar.getName().lastIndexOf('.')) + "-module.jar"); - } - - private static void addAutomaticModuleName(File originalJar, File moduleJar, String moduleName) { - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(originalJar))) { - Manifest manifest = inputStream.getManifest(); - manifest.getMainAttributes().put(new Attributes.Name("Automatic-Module-Name"), moduleName); - try (JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(moduleJar), inputStream.getManifest())) { - copyEntries(inputStream, outputStream); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo moduleInfo) { - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(originalJar))) { - try (JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(moduleJar), inputStream.getManifest())) { - copyEntries(inputStream, outputStream); - outputStream.putNextEntry(new JarEntry("module-info.class")); - outputStream.write(addModuleInfo(moduleInfo)); - outputStream.closeEntry(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void copyEntries(JarInputStream inputStream, JarOutputStream outputStream) throws IOException { - JarEntry jarEntry = inputStream.getNextJarEntry(); - while (jarEntry != null) { - outputStream.putNextEntry(jarEntry); - outputStream.write(inputStream.readAllBytes()); - outputStream.closeEntry(); - jarEntry = inputStream.getNextJarEntry(); - } - } - - private static byte[] addModuleInfo(ModuleInfo moduleInfo) { - ClassWriter classWriter = new ClassWriter(0); - classWriter.visit(Opcodes.V9, Opcodes.ACC_MODULE, "module-info", null, null, null); - ModuleVisitor moduleVisitor = classWriter.visitModule(moduleInfo.getModuleName(), Opcodes.ACC_OPEN, moduleInfo.getModuleVersion()); - for (String packageName : moduleInfo.getExports()) { - moduleVisitor.visitExport(packageName.replace('.', '/'), 0); - } - moduleVisitor.visitRequire("java.base", 0, null); - for (String requireName : moduleInfo.getRequires()) { - moduleVisitor.visitRequire(requireName, 0, null); - } - for (String requireName : moduleInfo.getRequiresTransitive()) { - moduleVisitor.visitRequire(requireName, Opcodes.ACC_TRANSITIVE, null); - } - moduleVisitor.visitEnd(); - classWriter.visitEnd(); - return classWriter.toByteArray(); - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java deleted file mode 100644 index 9884a91..0000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.gradle.sample.transform.javamodules; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * Data class to hold the information that should be added as module-info.class to an existing Jar file. - */ -public class ModuleInfo implements Serializable { - private String moduleName; - private String moduleVersion; - private List exports = new ArrayList<>(); - private List requires = new ArrayList<>(); - private List requiresTransitive = new ArrayList<>(); - - ModuleInfo(String moduleName, String moduleVersion) { - this.moduleName = moduleName; - this.moduleVersion = moduleVersion; - } - - public void exports(String exports) { - this.exports.add(exports); - } - - public void requires(String requires) { - this.requires.add(requires); - } - - public void requiresTransitive(String requiresTransitive) { - this.requiresTransitive.add(requiresTransitive); - } - - public String getModuleName() { - return moduleName; - } - - protected String getModuleVersion() { - return moduleVersion; - } - - protected List getExports() { - return exports; - } - - protected List getRequires() { - return requires; - } - - protected List getRequiresTransitive() { - return requiresTransitive; - } -}