From b31ce4e525ad933adaa1b4a070de79841d3fea4b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 19 Jan 2022 20:04:10 +0000 Subject: [PATCH] Remove log4j from compile classpath starting with Minecraft 22w03a. This is done to force modders to use SLF4J as Mojang have the ability to remove it at anytime. An option is provided to disable this. --- .../fabricmc/loom/api/LoomGradleExtensionAPI.java | 2 ++ .../loom/configuration/CompileConfiguration.java | 3 +++ .../minecraft/MinecraftLibraryProvider.java | 11 +++++++++-- .../providers/minecraft/MinecraftVersionMeta.java | 4 ++++ .../loom/extension/LoomGradleExtensionApiImpl.java | 9 +++++++++ src/main/java/net/fabricmc/loom/util/Constants.java | 5 +++++ .../loom/test/util/GradleProjectTestTrait.groovy | 8 +++++++- .../main/java/net/fabricmc/example/ExampleMod.java | 12 ++++++------ 8 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index 0fd99c3..6fc8721 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -152,4 +152,6 @@ public interface LoomGradleExtensionAPI { default void splitMinecraftJar() { getMinecraftJarConfiguration().set(MinecraftJarConfiguration.SPLIT); } + + Property getRuntimeOnlyLog4j(); } diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 1c62290..9e6f859 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -63,6 +63,7 @@ public final class CompileConfiguration { extension.createLazyConfiguration(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, configuration -> configuration.setTransitive(false)); extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_NAMED, configuration -> configuration.setTransitive(false)); // The launchers do not recurse dependencies NamedDomainObjectProvider serverDeps = extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_SERVER_DEPENDENCIES, configuration -> configuration.setTransitive(false)); + extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, configuration -> configuration.setTransitive(false)); extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_DEPENDENCIES, configuration -> { configuration.extendsFrom(serverDeps.get()); configuration.setTransitive(false); @@ -126,6 +127,8 @@ public final class CompileConfiguration { extendsFrom(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES, project); extendsFrom(JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES, project); + extendsFrom(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, project); + // Add the dev time dependencies project.getDependencies().add(Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES, Constants.Dependencies.DEV_LAUNCH_INJECTOR + Constants.Dependencies.Versions.DEV_LAUNCH_INJECTOR); project.getDependencies().add(Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES, Constants.Dependencies.TERMINAL_CONSOLE_APPENDER + Constants.Dependencies.Versions.TERMINAL_CONSOLE_APPENDER); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java index 567a147..b131189 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java @@ -38,9 +38,11 @@ public class MinecraftLibraryProvider { private static final Pattern NATIVES_PATTERN = Pattern.compile("^(?.*)/(.*?)/(?.*)/((?.*?)-([0-9].*?)-)(?.*).jar$"); public void provide(MinecraftProvider minecraftProvider, Project project) { - final MinecraftJarConfiguration jarConfiguration = LoomGradleExtension.get(project).getMinecraftJarConfiguration().get(); + final LoomGradleExtension extension = LoomGradleExtension.get(project); + final MinecraftJarConfiguration jarConfiguration = extension.getMinecraftJarConfiguration().get(); final MinecraftVersionMeta versionInfo = minecraftProvider.getVersionInfo(); final BundleMetadata serverBundleMetadata = minecraftProvider.getServerBundleMetadata(); + final boolean runtimeOnlyLog4j = versionInfo.isVersionOrNewer(Constants.MinecraftReleaseTimes.MC_20W03A) && extension.getRuntimeOnlyLog4j().get(); final boolean overrideLWJGL = LWJGLVersionOverride.overrideByDefault() || LWJGLVersionOverride.forceOverride(project) || Boolean.getBoolean("loom.test.lwjgloverride"); @@ -54,11 +56,16 @@ public class MinecraftLibraryProvider { } if (library.isValidForOS() && !library.hasNatives() && library.artifact() != null) { - if (serverBundleMetadata != null && isLibraryInBundle(serverBundleMetadata, library)) { + if (runtimeOnlyLog4j && library.name().startsWith("org.apache.logging.log4j")) { + // Make log4j a runtime only dep in 20w03a or later. Modders should use SLF4J. + project.getDependencies().add(Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, library.name()); + } else if (serverBundleMetadata != null && isLibraryInBundle(serverBundleMetadata, library)) { project.getDependencies().add(Constants.Configurations.MINECRAFT_SERVER_DEPENDENCIES, library.name()); } else if (jarConfiguration.getSupportedEnvironments().contains("client")) { // Client only library, or legacy version project.getDependencies().add(Constants.Configurations.MINECRAFT_DEPENDENCIES, library.name()); + } else { + throw new RuntimeException("Library %s was not added to a configuration".formatted(library.name())); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java index 86c1628..81009f4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java @@ -51,6 +51,10 @@ public record MinecraftVersionMeta( return downloads().get(key); } + public boolean isVersionOrNewer(String releaseTime) { + return this.releaseTime().compareTo(releaseTime) >= 0; + } + public record AssetIndex(String id, long totalSize, String path, String sha1, long size, String url) { public String fabricId(String version) { return id.equals(version) ? version : version + "-" + id; diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 282f47e..acca741 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -63,6 +63,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA protected final Property transitiveAccessWideners; protected final Property intermediary; protected final Property enableInterfaceInjection; + private final Property runtimeOnlyLog4j; private final Property minecraftJarConfiguration; private final ModVersionParser versionParser; @@ -104,6 +105,9 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA this.accessWidener.finalizeValueOnRead(); this.getGameJarProcessors().finalizeValueOnRead(); + + this.runtimeOnlyLog4j = project.getObjects().property(Boolean.class).convention(true); + this.runtimeOnlyLog4j.finalizeValueOnRead(); } @Override @@ -213,6 +217,11 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA return minecraftJarConfiguration; } + @Override + public Property getRuntimeOnlyLog4j() { + return runtimeOnlyLog4j; + } + // This is here to ensure that LoomGradleExtensionApiImpl compiles without any unimplemented methods private final class EnsureCompile extends LoomGradleExtensionApiImpl { private EnsureCompile() { diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 5a06327..d73dcd8 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -68,6 +68,7 @@ public class Constants { */ public static final String MINECRAFT_SERVER_DEPENDENCIES = "minecraftServerLibraries"; public static final String MINECRAFT_DEPENDENCIES = "minecraftLibraries"; + public static final String MINECRAFT_RUNTIME_DEPENDENCIES = "minecraftRuntimeOnlyLibraries"; public static final String MINECRAFT_NATIVES = "minecraftNatives"; public static final String MINECRAFT_NAMED = "minecraftNamed"; public static final String MAPPINGS = "mappings"; @@ -141,4 +142,8 @@ public class Constants { private TaskGroup() { } } + + public static final class MinecraftReleaseTimes { + public static final String MC_20W03A = "2022-01-19T16:04:59+00:00"; + } } diff --git a/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy b/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy index 45b5cb5..9b10889 100644 --- a/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/util/GradleProjectTestTrait.groovy @@ -107,10 +107,12 @@ trait GradleProjectTestTrait { throw new FileNotFoundException("Failed to find project directory at: $projectSourceDir.absolutePath") } + def settingsGradle = new File(projectDir, "settings.gradle") + // Cleanup some basic things if they already exists new File(projectDir, "src").deleteDir() new File(projectDir, "build.gradle").delete() - new File(projectDir, "settings.gradle").delete() + settingsGradle.delete() projectSourceDir.eachFileRecurse { file -> if (file.isDirectory()) { @@ -128,6 +130,10 @@ trait GradleProjectTestTrait { tempFile.parentFile.mkdirs() tempFile.bytes = file.bytes } + + if (!settingsGradle.exists()) { + settingsGradle.createNewFile() + } } @Immutable diff --git a/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java index e698549..7155f5a 100644 --- a/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java +++ b/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java @@ -1,14 +1,14 @@ package net.fabricmc.example; import net.fabricmc.api.ModInitializer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class ExampleMod implements ModInitializer { + public static final Logger LOGGER = LogManager.getLogger("modid"); + @Override public void onInitialize() { - // This code runs as soon as Minecraft is in a mod-load-ready state. - // However, some things (like resources) may still be uninitialized. - // Proceed with mild caution. - - System.out.println("Hello simple Fabric mod"); + LOGGER.info("Hello Fabric world!"); } -} +} \ No newline at end of file