diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/JarSplitter.java b/src/main/java/net/fabricmc/loom/configuration/mods/JarSplitter.java index 57348e0a..6090d0ec 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/JarSplitter.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/JarSplitter.java @@ -47,6 +47,8 @@ import net.fabricmc.loom.task.AbstractRemapJarTask; import net.fabricmc.loom.util.FileSystemUtil; public class JarSplitter { + public static final String MANIFEST_SPLIT_ENV_NAME_KEY = "Fabric-Loom-Split-Environment-Name"; + final Path inputJar; public JarSplitter(Path inputJar) { @@ -155,30 +157,7 @@ public class JarSplitter { final String entryPath = relativePath.toString(); - /* - Copy the manifest to both jars - - Remove signature data - - Remove split data as its already been split. - */ if (entryPath.equals(AbstractRemapJarTask.MANIFEST_PATH)) { - final Manifest outManifest = new Manifest(manifest); - final Attributes attributes = outManifest.getMainAttributes(); - stripSignatureData(outManifest); - - attributes.remove(Attributes.Name.SIGNATURE_VERSION); - Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_SPLIT_ENV_NAME)); - Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_NAME)); - - // TODO add an attribute to denote if the jar is common or client now - - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - - outManifest.write(out); - final byte[] manifestBytes = out.toByteArray(); - - writeBytes(manifestBytes, commonOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH)); - writeBytes(manifestBytes, clientOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH)); - continue; } @@ -192,12 +171,39 @@ public class JarSplitter { Files.copy(entry, outputEntry, StandardCopyOption.COPY_ATTRIBUTES); } + + /* + Write the manifest to both jars + - Remove signature data + - Remove split data as its already been split. + - Add env name. + */ + final Manifest outManifest = new Manifest(manifest); + final Attributes attributes = outManifest.getMainAttributes(); + stripSignatureData(outManifest); + + attributes.remove(Attributes.Name.SIGNATURE_VERSION); + Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_SPLIT_ENV_NAME)); + Objects.requireNonNull(attributes.remove(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_NAME)); + + writeBytes(writeWithEnvironment(outManifest, "common"), commonOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH)); + writeBytes(writeWithEnvironment(outManifest, "client"), clientOutput.getPath(AbstractRemapJarTask.MANIFEST_PATH)); } } return true; } + private byte[] writeWithEnvironment(Manifest in, String value) throws IOException { + final Manifest manifest = new Manifest(in); + final Attributes attributes = manifest.getMainAttributes(); + attributes.putValue(MANIFEST_SPLIT_ENV_NAME_KEY, value); + + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + manifest.write(out); + return out.toByteArray(); + } + private List readClientEntries(Manifest manifest) { final Attributes attributes = manifest.getMainAttributes(); final String clientEntriesValue = attributes.getValue(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_KEY); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarSplitter.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarSplitter.java index 87d7a800..7e11eba6 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarSplitter.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarSplitter.java @@ -39,6 +39,7 @@ import java.util.stream.Stream; import com.google.common.collect.Sets; +import net.fabricmc.loom.configuration.mods.JarSplitter; import net.fabricmc.loom.util.FileSystemUtil; public class MinecraftJarSplitter implements AutoCloseable { @@ -65,8 +66,8 @@ public class MinecraftJarSplitter implements AutoCloseable { // Not something we expect, will require 3 jars, server, client and common. assert entryData.serverOnlyEntries.isEmpty(); - copyEntriesToJar(entryData.commonEntries, serverInputJar, commonOutputJar); - copyEntriesToJar(entryData.clientOnlyEntries, clientInputJar, clientOnlyOutputJar); + copyEntriesToJar(entryData.commonEntries, serverInputJar, commonOutputJar, "common"); + copyEntriesToJar(entryData.clientOnlyEntries, clientInputJar, clientOnlyOutputJar, "client"); } public void sharedEntry(String path) { @@ -104,7 +105,7 @@ public class MinecraftJarSplitter implements AutoCloseable { return entries; } - private void copyEntriesToJar(Set entries, Path inputJar, Path outputJar) throws IOException { + private void copyEntriesToJar(Set entries, Path inputJar, Path outputJar, String env) throws IOException { Files.deleteIfExists(outputJar); try (FileSystemUtil.Delegate inputFs = FileSystemUtil.getJarFileSystem(inputJar); @@ -124,13 +125,14 @@ public class MinecraftJarSplitter implements AutoCloseable { Files.copy(inputPath, outputPath, StandardCopyOption.COPY_ATTRIBUTES); } - writeManifest(outputFs); + writeManifest(outputFs, env); } } - private void writeManifest(FileSystemUtil.Delegate outputFs) throws IOException { + private void writeManifest(FileSystemUtil.Delegate outputFs, String env) throws IOException { final Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); + manifest.getMainAttributes().putValue(JarSplitter.MANIFEST_SPLIT_ENV_NAME_KEY, env); ByteArrayOutputStream out = new ByteArrayOutputStream(); manifest.write(out); Files.createDirectories(outputFs.get().getPath("META-INF"));