From b31ce4e525ad933adaa1b4a070de79841d3fea4b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 19 Jan 2022 20:04:10 +0000 Subject: [PATCH 1/2] 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 0fd99c3c..6fc87212 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 1c62290a..9e6f859a 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 567a1479..b1311893 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 86c16286..81009f46 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 282f47ec..acca7410 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 5a06327e..d73dcd81 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 45b5cb50..9b108895 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 e6985491..7155f5a5 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 From f113b0e312fe094ba7b8a15f5697b65d1cf01a61 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 19 Jan 2022 20:54:24 +0000 Subject: [PATCH 2/2] Fix server only, and broken test. --- .../providers/minecraft/MinecraftLibraryProvider.java | 2 +- .../simple/src/main/java/net/fabricmc/example/ExampleMod.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 b1311893..66f2c4b1 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 @@ -65,7 +65,7 @@ public class MinecraftLibraryProvider { // 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())); + project.getLogger().debug("Minecraft library ({}) was not added to any configuration", library.name()); } } 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 7155f5a5..bd3cb846 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 @@ -9,6 +9,6 @@ public class ExampleMod implements ModInitializer { @Override public void onInitialize() { - LOGGER.info("Hello Fabric world!"); + LOGGER.info("Hello simple Fabric mod!"); } } \ No newline at end of file