From e6b5356bbd14d9292564d761756b5637943fd5a0 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 10 Aug 2022 17:41:07 +0100 Subject: [PATCH 1/3] Fix failing unit test. --- .../test/unit/MinecraftJarSplitterTest.groovy | 3 ++- .../loom/test/util/GradleTestUtil.groovy | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/MinecraftJarSplitterTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/MinecraftJarSplitterTest.groovy index 0b6d9793..a0696a50 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/MinecraftJarSplitterTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/MinecraftJarSplitterTest.groovy @@ -26,6 +26,7 @@ package net.fabricmc.loom.test.unit import net.fabricmc.loom.configuration.providers.BundleMetadata import net.fabricmc.loom.configuration.providers.minecraft.MinecraftJarSplitter +import net.fabricmc.loom.test.util.GradleTestUtil import spock.lang.Specification class MinecraftJarSplitterTest extends Specification { @@ -44,7 +45,7 @@ class MinecraftJarSplitterTest extends Specification { def commonJar = new File(mcJarDir, "common.jar") when: def serverBundleMetadata = BundleMetadata.fromJar(serverBundleJar.toPath()) - serverBundleMetadata.versions().find().unpackEntry(serverBundleJar.toPath(), serverJar.toPath()) + serverBundleMetadata.versions().find().unpackEntry(serverBundleJar.toPath(), serverJar.toPath(), GradleTestUtil.mockProject()) clientOnlyJar.delete() commonJar.delete() diff --git a/src/test/groovy/net/fabricmc/loom/test/util/GradleTestUtil.groovy b/src/test/groovy/net/fabricmc/loom/test/util/GradleTestUtil.groovy index 479e5256..3e416a12 100644 --- a/src/test/groovy/net/fabricmc/loom/test/util/GradleTestUtil.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/util/GradleTestUtil.groovy @@ -24,6 +24,8 @@ package net.fabricmc.loom.test.util +import net.fabricmc.loom.LoomGradleExtension +import org.gradle.api.Project import org.gradle.api.file.SourceDirectorySet import org.gradle.api.internal.tasks.DefaultSourceSet import org.gradle.api.model.ObjectFactory @@ -50,6 +52,26 @@ class GradleTestUtil { return sourceSet } + static Project mockProject() { + def mock = mock(Project.class) + def extensions = mockExtensionContainer() + when(mock.getExtensions()).thenReturn(extensions) + return mock + } + + static ExtensionContainer mockExtensionContainer() { + def mock = mock(ExtensionContainer.class) + def extension = mockLoomGradleExtension() + when(mock.getByName("loom")).thenReturn(extension) + return mock + } + + static LoomGradleExtension mockLoomGradleExtension() { + def mock = mock(LoomGradleExtension.class) + when(mock.refreshDeps()).thenReturn(false) + return mock + } + static ObjectFactory mockObjectFactory() { def mock = mock(ObjectFactory.class) def mockSourceDirectorySet = mockSourceDirectorySet() From 86f07dad08a067874869ea1136b638833fb3d9b2 Mon Sep 17 00:00:00 2001 From: Juuxel <6596629+Juuxel@users.noreply.github.com> Date: Wed, 10 Aug 2022 19:45:51 +0300 Subject: [PATCH 2/3] Fix #699 (#701) --- .../fabricmc/loom/task/AbstractRunTask.java | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index 276c6d51..0f669a0a 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -56,15 +56,28 @@ public abstract class AbstractRunTask extends JavaExec { this.config = configProvider.apply(getProject()); setClasspath(config.sourceSet.getRuntimeClasspath().filter(File::exists).filter(new LibraryFilter())); - // Pass an empty classpath to the super JavaExec. - super.setClasspath(getProject().files()); args(config.programArgs); getMainClass().set(config.mainClass); } + private boolean canUseArgFile() { + // @-files were added for java (not javac) in Java 9, see https://bugs.openjdk.org/browse/JDK-8027634 + return getJavaVersion().isJava9Compatible(); + } + @Override public void exec() { + if (canUseArgFile()) { + getProject().getLogger().debug("Using arg file for {}", getName()); + // We're using an arg file, pass an empty classpath to the super JavaExec. + super.setClasspath(getProject().files()); + } else { + getProject().getLogger().debug("Using bare classpath for {}", getName()); + // The classpath is passed normally, so pass the full classpath to the super JavaExec. + super.setClasspath(classpath); + } + setWorkingDir(new File(getProject().getProjectDir(), config.runDir)); environment(config.environmentVariables); @@ -85,16 +98,18 @@ public abstract class AbstractRunTask extends JavaExec { final List superArgs = super.getJvmArgs(); final List args = new ArrayList<>(); - final String content = "-classpath\n" + this.classpath.getFiles().stream() - .map(File::getAbsolutePath) - .collect(Collectors.joining(System.getProperty("path.separator"))); + if (canUseArgFile()) { + final String content = "-classpath\n" + this.classpath.getFiles().stream() + .map(File::getAbsolutePath) + .collect(Collectors.joining(System.getProperty("path.separator"))); - try { - final Path argsFile = Files.createTempFile("loom-classpath", ".args"); - Files.writeString(argsFile, content, StandardCharsets.UTF_8); - args.add("@" + argsFile.toAbsolutePath()); - } catch (IOException e) { - throw new UncheckedIOException("Failed to create classpath file", e); + try { + final Path argsFile = Files.createTempFile("loom-classpath", ".args"); + Files.writeString(argsFile, content, StandardCharsets.UTF_8); + args.add("@" + argsFile.toAbsolutePath()); + } catch (IOException e) { + throw new UncheckedIOException("Failed to create classpath file", e); + } } if (superArgs != null) { From fdba3b476db37329306f75f1d8f22cc755dbdbc2 Mon Sep 17 00:00:00 2001 From: Juuxel <6596629+Juuxel@users.noreply.github.com> Date: Wed, 10 Aug 2022 20:45:39 +0300 Subject: [PATCH 3/3] Mark all Minecraft libraries as non-transitive (#702) * Fix #700 * Make all MC libraries non-transitive --- .../minecraft/MinecraftLibraryProvider.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 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 588b20f7..ff8dc56e 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 @@ -28,6 +28,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.gradle.api.Project; +import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.ModuleDependency; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomRepositoryPlugin; @@ -60,6 +62,16 @@ public class MinecraftLibraryProvider { assert provideClient || provideServer; } + private void addDependency(String configuration, Object dependency) { + Dependency created = project.getDependencies().add(configuration, dependency); + + // The launcher doesn't download transitive deps, so neither will we. + // This will also prevent a LaunchWrapper library dependency from pulling in outdated ASM jars. + if (created instanceof ModuleDependency md) { + md.setTransitive(false); + } + } + public void provide() { if (provideClient) { // Modern 1.19 version put the natives on the classpath. @@ -116,17 +128,17 @@ public class MinecraftLibraryProvider { if (runtimeOnlyLog4j && name.startsWith("org.apache.logging.log4j")) { // Make log4j a runtime only dep to force slf4j. - project.getDependencies().add(Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, name); + addDependency(Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, name); continue; } if (classpathArmNatives && name.startsWith("org.lwjgl:") && (name.endsWith("natives-windows") || name.endsWith("natives-linux"))) { // Add windows and Linux arm64 natives for modern classpath native MC versions. - project.getDependencies().add(Constants.Configurations.MINECRAFT_DEPENDENCIES, name + "-arm64"); + addDependency(Constants.Configurations.MINECRAFT_DEPENDENCIES, name + "-arm64"); } - project.getDependencies().add(Constants.Configurations.MINECRAFT_DEPENDENCIES, name); + addDependency(Constants.Configurations.MINECRAFT_DEPENDENCIES, name); } if (library.hasNativesForOS()) { @@ -140,11 +152,11 @@ public class MinecraftLibraryProvider { for (BundleMetadata.Entry library : serverBundleMetadata.libraries()) { if (runtimeOnlyLog4j && library.name().startsWith("org.apache.logging.log4j")) { // Make log4j a runtime only dep to force slf4j. - project.getDependencies().add(Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, library.name()); + addDependency(Constants.Configurations.MINECRAFT_RUNTIME_DEPENDENCIES, library.name()); continue; } - project.getDependencies().add(Constants.Configurations.MINECRAFT_SERVER_DEPENDENCIES, library.name()); + addDependency(Constants.Configurations.MINECRAFT_SERVER_DEPENDENCIES, library.name()); } } } @@ -177,6 +189,6 @@ public class MinecraftLibraryProvider { } project.getLogger().debug("Add native dependency '{}'", dependencyNotation); - project.getDependencies().add(Constants.Configurations.MINECRAFT_NATIVES, dependencyNotation); + addDependency(Constants.Configurations.MINECRAFT_NATIVES, dependencyNotation); } }