mirror of
https://github.com/architectury/architectury-loom.git
synced 2026-03-30 13:05:27 -05:00
Add env manifest entry to split jars.
This commit is contained in:
@@ -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<String> readClientEntries(Manifest manifest) {
|
||||
final Attributes attributes = manifest.getMainAttributes();
|
||||
final String clientEntriesValue = attributes.getValue(AbstractRemapJarTask.MANIFEST_CLIENT_ENTRIES_KEY);
|
||||
|
||||
@@ -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<String> entries, Path inputJar, Path outputJar) throws IOException {
|
||||
private void copyEntriesToJar(Set<String> 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"));
|
||||
|
||||
Reference in New Issue
Block a user