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] 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) {