diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 2353bc44..26a594d6 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -30,6 +30,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.Serializable; +import java.io.UncheckedIOException; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.FileAlreadyExistsException; @@ -43,6 +44,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.function.Supplier; +import java.util.jar.Attributes; +import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.stream.Collectors; @@ -111,6 +114,17 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { @Input public abstract SetProperty getAtAccessWideners(); + /** + * Configures whether to read mixin configs from jar manifest + * if a fabric.mod.json cannot be found. + * + *

This is enabled by default on Forge, but not on other platforms. + * + * @return the property + */ + @Input + public abstract Property getReadMixinConfigsFromManifest(); + private Supplier tinyRemapperService = Suppliers.memoize(() -> TinyRemapperService.getOrCreate(this)); @Inject @@ -119,6 +133,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { getClasspath().from(getProject().getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME)); getAddNestedDependencies().convention(true).finalizeValueOnRead(); + getReadMixinConfigsFromManifest().convention(LoomGradleExtension.get(getProject()).isForge()).finalizeValueOnRead(); if (LoomGradleExtension.get(getProject()).supportsInclude()) { Configuration includeConfiguration = getProject().getConfigurations().getByName(Constants.Configurations.INCLUDE); @@ -180,16 +195,21 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { private void setupLegacyMixinRefmapRemapping(RemapParams params) { final LoomGradleExtension extension = LoomGradleExtension.get(getProject()); final MixinExtension mixinExtension = extension.getMixin(); + final Collection allMixinConfigs; final JsonObject fabricModJson = MixinRefmapHelper.readFabricModJson(getInputFile().getAsFile().get()); if (fabricModJson == null) { - getProject().getLogger().warn("Could not find fabric.mod.json file in: " + getInputFile().getAsFile().get().getName()); - return; + if (getReadMixinConfigsFromManifest().get()) { + allMixinConfigs = readMixinConfigsFromManifest(); + } else { + getProject().getLogger().warn("Could not find fabric.mod.json file in: " + getInputFile().getAsFile().get().getName()); + return; + } + } else { + allMixinConfigs = MixinRefmapHelper.getMixinConfigurationFiles(fabricModJson); } - final Collection allMixinConfigs = MixinRefmapHelper.getMixinConfigurationFiles(fabricModJson); - for (SourceSet sourceSet : mixinExtension.getMixinSourceSets()) { MixinExtension.MixinInformationContainer container = Objects.requireNonNull( MixinExtension.getMixinInformationContainer(sourceSet) @@ -230,6 +250,22 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { } } + private Collection readMixinConfigsFromManifest() { + File inputJar = getInputFile().get().getAsFile(); + + try (JarFile jar = new JarFile(inputJar)) { + Attributes attributes = jar.getManifest().getMainAttributes(); + + if (attributes.containsKey(Constants.Forge.MIXIN_CONFIGS_MANIFEST_KEY)) { + return Set.of(attributes.getValue(Constants.Forge.MIXIN_CONFIGS_MANIFEST_KEY).split(",")); + } else { + return Set.of(); + } + } catch (IOException e) { + throw new UncheckedIOException("Could not read mixin configs from input jar", e); + } + } + public interface RemapParams extends AbstractRemapParams { ConfigurableFileCollection getNestedJars(); ConfigurableFileCollection getRemapClasspath(); diff --git a/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java b/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java index 1b488b57..a9a8c4e0 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java +++ b/src/main/java/net/fabricmc/loom/task/RemapTaskConfiguration.java @@ -84,7 +84,7 @@ public class RemapTaskConfiguration { if (!mixinConfigs.isEmpty()) { task.manifest(manifest -> { - manifest.attributes(Map.of("MixinConfigs", String.join(",", mixinConfigs))); + manifest.attributes(Map.of(Constants.Forge.MIXIN_CONFIGS_MANIFEST_KEY, String.join(",", mixinConfigs))); }); } } diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 83028f28..995f77ba 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -178,6 +178,7 @@ public class Constants { public static final class Forge { public static final String LAUNCH_TESTING = "net.minecraftforge.userdev.LaunchTesting"; public static final String ACCESS_TRANSFORMER_PATH = "META-INF/accesstransformer.cfg"; + public static final String MIXIN_CONFIGS_MANIFEST_KEY = "MixinConfigs"; private Forge() { }