Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `
- package org.example
- 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.ArchiveOperations
- import org.gradle.api.file.FileSystemLocation
- import org.gradle.api.provider.Provider
- import java.util.jar.JarEntry
- import java.util.jar.JarInputStream
- import java.util.jar.JarOutputStream
- import javax.inject.Inject
- abstract class JavaModuleTransform implements TransformAction<TransformParameters.None> {
- @InputArtifact
- abstract Provider<FileSystemLocation> getInputArtifact()
- @Inject
- abstract ArchiveOperations getArchiveOperations()
- @Override
- void transform(TransformOutputs outputs) {
- def isModule = archiveOperations.zipTree(inputArtifact).any { it.name == "module-info.class" }
- if (isModule) {
- outputs.file(inputArtifact)
- } else {
- def originalJar = getInputArtifact().get().asFile
- def originalJarName = originalJar.name.substring(0, originalJar.name.lastIndexOf('.'))
- if (this.class.getResourceAsStream("${originalJarName}/module-info.class") == null) {
- return;
- }
- println("${originalJarName}/module-info.class")
- def target = outputs.file(originalJarName + "-module.jar")
- new JarInputStream(new FileInputStream(originalJar)).withStream { input ->
- new JarOutputStream(new FileOutputStream(target), input.manifest).withStream { output ->
- var jarEntry = input.nextJarEntry
- while (jarEntry != null) {
- output.putNextEntry(jarEntry)
- // Use a ByteArrayOutputStream to read the content of the entry
- ByteArrayOutputStream baos = new ByteArrayOutputStream()
- byte[] buffer = new byte[1024]
- int len
- while ((len = input.read(buffer)) != -1) {
- baos.write(buffer, 0, len)
- }
- byte[] bytes = baos.toByteArray()
- output.write(bytes)
- output.closeEntry()
- jarEntry = input.nextJarEntry
- }
- output.putNextEntry(new JarEntry("module-info.class"))
- // Use getResourceAsStream directly without BufferedInputStream
- InputStream inputStream = this.class.getResourceAsStream("${originalJarName}/module-info.class")
- System.out.println("${originalJarName}/module-info.class")
- byte[] bytes = new byte[inputStream.available()]
- DataInputStream dataInputStream = new DataInputStream(inputStream)
- dataInputStream.readFully(bytes)
- output.write(bytes)
- output.closeEntry()
- }
- }
- }
- }
- }
- `
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement