Skip to content

Commit 511f517

Browse files
authored
Use the appropriate Java version for the chosen Minecraft version (#199)
1 parent 600437d commit 511f517

File tree

7 files changed

+65
-13
lines changed

7 files changed

+65
-13
lines changed

src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeMetadataTransform.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@ public void adaptWithConfig(ComponentMetadataContext context, JsonObject config)
5757
});
5858
details.addVariant("modDevModulePath", variantMetadata -> {
5959
variantMetadata.withDependencies(dependencies -> {
60-
var modules = config.getAsJsonArray("modules");
61-
for (JsonElement module : modules) {
62-
dependencies.add(module.getAsString());
60+
// Support versions that do not declare modules
61+
if (config.has("modules")) {
62+
var modules = config.getAsJsonArray("modules");
63+
for (JsonElement module : modules) {
64+
dependencies.add(module.getAsString());
65+
}
6366
}
6467
});
6568
variantMetadata.withCapabilities(capabilities -> {
@@ -96,9 +99,12 @@ public void adaptWithConfig(ComponentMetadataContext context, JsonObject config)
9699
variantMetadata.withDependencies(vanillaDependencies);
97100
variantMetadata.withFiles(MutableVariantFilesMetadata::removeAllFiles);
98101
variantMetadata.withDependencies(dependencies -> {
99-
var modules = config.getAsJsonArray("modules");
100-
for (JsonElement module : modules) {
101-
dependencies.add(module.getAsString());
102+
// Support versions that do not declare modules
103+
if (config.has("modules")) {
104+
var modules = config.getAsJsonArray("modules");
105+
for (JsonElement module : modules) {
106+
dependencies.add(module.getAsString());
107+
}
102108
}
103109
var libraries = config.getAsJsonArray("libraries");
104110
for (JsonElement library : libraries) {

src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import net.neoforged.moddevgradle.dsl.NeoForgeExtension;
44
import net.neoforged.moddevgradle.internal.LegacyForgeFacade;
55
import net.neoforged.moddevgradle.internal.ModDevPlugin;
6+
import net.neoforged.moddevgradle.internal.utils.ExtensionUtils;
7+
import net.neoforged.moddevgradle.internal.utils.VersionCapabilities;
68
import net.neoforged.moddevgradle.legacyforge.dsl.MixinExtension;
79
import net.neoforged.moddevgradle.legacyforge.dsl.Obfuscation;
10+
import net.neoforged.nfrtgradle.CreateMinecraftArtifacts;
811
import org.gradle.api.Plugin;
912
import org.gradle.api.Project;
1013
import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
@@ -14,6 +17,9 @@
1417
import org.gradle.api.tasks.SourceSet;
1518
import org.gradle.api.tasks.SourceSetContainer;
1619
import org.gradle.jvm.tasks.Jar;
20+
import org.gradle.jvm.toolchain.JavaLanguageVersion;
21+
import org.gradle.jvm.toolchain.JavaLauncher;
22+
import org.gradle.jvm.toolchain.JavaToolchainService;
1723
import org.jetbrains.annotations.ApiStatus;
1824

1925
import java.net.URI;
@@ -133,6 +139,24 @@ public void apply(Project project) {
133139
.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE);
134140
});
135141

142+
// Set the right Java version
143+
project.getTasks().withType(CreateMinecraftArtifacts.class).configureEach(task -> {
144+
var extension = ExtensionUtils.getExtension(project, NeoForgeExtension.NAME, NeoForgeExtension.class);
145+
var toolchainService = ExtensionUtils.getExtension(project, "javaToolchains", JavaToolchainService.class);
146+
task.getToolsJavaExecutable().set(
147+
toolchainService.launcherFor(spec -> {
148+
spec.getLanguageVersion().set(
149+
extension.getVersion().map(VersionCapabilities::ofForgeVersion)
150+
.orElse(extension.getNeoFormVersion().map(VersionCapabilities::ofNeoFormVersion))
151+
.map(VersionCapabilities::javaVersion)
152+
.map(JavaLanguageVersion::of)
153+
);
154+
})
155+
.map(JavaLauncher::getExecutablePath)
156+
.map(f -> f.getAsFile().getAbsolutePath())
157+
);
158+
});
159+
136160
obf.createRemappingConfiguration(project.getConfigurations().getByName(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME));
137161
obf.createRemappingConfiguration(project.getConfigurations().getByName(JavaPlugin.RUNTIME_ONLY_CONFIGURATION_NAME));
138162
obf.createRemappingConfiguration(project.getConfigurations().getByName(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME));

src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/McpMetadataTransform.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ protected void adaptWithConfig(ComponentMetadataContext context, JsonObject conf
3939

4040
var zipDataName = id.getName() + "-" + id.getVersion() + ".zip";
4141

42-
var javaTarget = config.getAsJsonPrimitive("java_target").getAsInt();
42+
// Very old versions did not specify this. Default to 8 in those cases.
43+
var javaTarget = config.has("java_target")
44+
? config.getAsJsonPrimitive("java_target").getAsInt()
45+
: 8;
4346

4447
// a.k.a. "neoformData"
4548
// Primarily pulled to use for NFRT manifest
@@ -61,7 +64,8 @@ protected void adaptWithConfig(ComponentMetadataContext context, JsonObject conf
6164
});
6265
});
6366

64-
dependencies(context, "mcpRuntimeElements", javaTarget, Usage.JAVA_RUNTIME, deps -> {});
67+
dependencies(context, "mcpRuntimeElements", javaTarget, Usage.JAVA_RUNTIME, deps -> {
68+
});
6569

6670
dependencies(context, "mcpApiElements", javaTarget, Usage.JAVA_API, dependencies -> {
6771
var libraries = config.getAsJsonObject("libraries").getAsJsonArray("joined");

src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ public void apply(Project project) {
153153
ideIntegration.runTaskOnProjectSync(extension.getIdeSyncTasks());
154154
var dependencyFactory = project.getDependencyFactory();
155155

156+
Provider<VersionCapabilities> versionCapabilities = extension.getVersion().map(VersionCapabilities::ofForgeVersion)
157+
.orElse(extension.getNeoFormVersion().map(VersionCapabilities::ofNeoFormVersion))
158+
.orElse(VersionCapabilities.latest());
159+
156160
// When a NeoForge version is specified, we use the dependencies published by that, and otherwise
157161
// we fall back to a potentially specified NeoForm version, which allows us to run in "Vanilla" mode.
158162
var neoForgeModDevLibrariesDependency = extension.getNeoForgeArtifact().map(artifactId -> {
@@ -275,7 +279,7 @@ public void apply(Project project) {
275279
project.afterEvaluate(ignored -> {
276280
var toolchainSpec = javaExtension.getToolchain();
277281
try {
278-
toolchainSpec.getLanguageVersion().convention(JavaLanguageVersion.of(21));
282+
toolchainSpec.getLanguageVersion().convention(versionCapabilities.map(VersionCapabilities::javaVersion).map(JavaLanguageVersion::of));
279283
} catch (IllegalStateException e) {
280284
// We tried our best
281285
}
@@ -325,7 +329,7 @@ public void apply(Project project) {
325329
modulePath -> modulePath.getDependencies().addLater(modulePathDependency),
326330
legacyClassPath -> legacyClassPath.extendsFrom(additionalClasspath),
327331
downloadAssets.flatMap(DownloadAssets::getAssetPropertiesFile),
328-
extension.getNeoFormVersion().map(VersionCapabilities::ofNeoFormVersion)
332+
versionCapabilities
329333
);
330334

331335
setupJarJar(project);
@@ -506,7 +510,7 @@ static void setupRuns(Project project,
506510
});
507511

508512
// Create an empty task similar to "assemble" which can be used to generate all launch scripts at once
509-
var createLaunchScriptsTask= project.getTasks().register("createLaunchScripts", Task.class, task -> {
513+
var createLaunchScriptsTask = project.getTasks().register("createLaunchScripts", Task.class, task -> {
510514
task.setGroup(branding.publicTaskGroup());
511515
task.setDescription("Creates batch files/shell scripts to launch the game from outside of Gradle (i.e. Renderdoc, NVidia Nsight, etc.)");
512516
});

src/main/java/net/neoforged/nfrtgradle/CreateMinecraftArtifacts.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ public CreateMinecraftArtifacts() {
3939
getParchmentEnabled().convention(false);
4040
}
4141

42+
/**
43+
* Path to the Java installation to use for running external tools with. This does not have to match
44+
* NFRTs Java version. I.e. if running NFRT for MC 1.12, this would need to be Java 8, since the decompiler
45+
* and other tools in that version were not updated to run with Java 21.
46+
*/
47+
@Input
48+
@Optional
49+
public abstract Property<String> getToolsJavaExecutable();
50+
4251
/**
4352
* Files added to this collection will be passed to NFRT via the {@code --access-transformer}
4453
* command line option.
@@ -169,6 +178,11 @@ public void createArtifacts() {
169178
var args = new ArrayList<String>();
170179
args.add("run");
171180

181+
if (getToolsJavaExecutable().isPresent()) {
182+
args.add("--java-executable");
183+
args.add(getToolsJavaExecutable().get());
184+
}
185+
172186
for (var accessTransformer : getAccessTransformers().getFiles()) {
173187
args.add("--access-transformer");
174188
args.add(accessTransformer.getAbsolutePath());

src/main/java/net/neoforged/nfrtgradle/NeoFormRuntimeExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
public abstract class NeoFormRuntimeExtension {
1414
public static final String NAME = "neoFormRuntime";
1515

16-
private static final String DEFAULT_NFRT_VERSION = "1.0.12";
16+
private static final String DEFAULT_NFRT_VERSION = "1.0.13";
1717

1818
@Inject
1919
public NeoFormRuntimeExtension(Project project) {

src/main/java/net/neoforged/nfrtgradle/NeoFormRuntimeTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public NeoFormRuntimeTask() {
103103
// Store temporary working directories in this projects build directory such that gradle clean removes them
104104
getWorkDirectory().convention(project.getLayout().getBuildDirectory().dir("tmp/neoformruntime"));
105105

106-
// Default to J21 for NFRT
106+
// Run NFRT itself with Java 21
107107
getJavaExecutable().convention(getJavaToolchainService()
108108
.launcherFor(spec -> spec.getLanguageVersion().set(JavaLanguageVersion.of(21)))
109109
.map(javaLauncher -> javaLauncher.getExecutablePath().getAsFile().getAbsolutePath())

0 commit comments

Comments
 (0)