Skip to content

Commit 7a7906b

Browse files
committed
Use privileged lookup if possible
Fix jopt help messages Add module-info to our built jar
1 parent 6a0352c commit 7a7906b

6 files changed

Lines changed: 84 additions & 9 deletions

File tree

build.gradle

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ plugins {
1010
alias libs.plugins.changelog
1111
alias libs.plugins.licenser
1212
alias libs.plugins.shadow
13+
alias libs.plugins.multirelease
1314
}
1415

1516
gradleutils.displayName = 'Slime Launcher'
@@ -45,7 +46,8 @@ tasks.named('jar', Jar) {
4546
manifest {
4647
attributes([
4748
'Main-Class': 'net.minecraftforge.launcher.Main',
48-
'Automatic-Module-Name': 'net.minecraftforge.launcher'
49+
'Automatic-Module-Name': 'net.minecraftforge.launcher',
50+
'Add-Opens': 'java.base/java.lang.invoke=net.minecraftforge.launcher'
4951
])
5052

5153
gradleutils.manifestDefaults(it, 'net/minecraftforge/launcher/')
@@ -54,9 +56,38 @@ tasks.named('jar', Jar) {
5456
archiveClassifier = 'thin'
5557
}
5658

59+
60+
multiRelease.register {
61+
add(JavaLanguageVersion.of(9), project(':slime-launcher-j9'))
62+
}
63+
def multiReleaseJar = tasks.named('multiReleaseJar', Jar) {
64+
includeEmptyDirs = false
65+
eachFile({
66+
if (name == 'module-info.class')
67+
path = 'module-info.class'
68+
if (name == 'DummyForModule.class')
69+
exclude()
70+
})
71+
}
72+
5773
tasks.named('shadowJar', ShadowJar) {
74+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
75+
76+
dependsOn multiReleaseJar
77+
from({zipTree(multiReleaseJar.get().archiveFile.get().asFile)})
78+
exclude('META-INF/maven/**')
79+
exclude('META-INF/proguard/**')
80+
5881
enableAutoRelocation = true
5982
relocationPrefix = 'net.minecraftforge.launcher.shadow'
83+
relocate 'com.google.errorprone.annotations', 'net.minecraftforge.launcher.shadow.errorprone'
84+
relocate 'com.google.gson', 'net.minecraftforge.launcher.shadow.gson'
85+
relocate 'net.minecraftforge.util', 'net.minecraftforge.launcher.shadow.util'
86+
// Rewrite JOpt's message files, so that help text is displayed nicely.
87+
transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) {
88+
paths = [ 'Messages.properties$' ]
89+
keyTransformer = { key -> 'net.minecraftforge.launcher.shadow.' + key }
90+
}
6091

6192
archiveClassifier = ''
6293
}

settings.gradle

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ gradle.beforeProject { Project project ->
1919

2020
//@formatter:off
2121
dependencyResolutionManagement.versionCatalogs.register('libs') {
22-
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0'
23-
plugin 'gradleutils', 'net.minecraftforge.gradleutils' version '3.3.21'
24-
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.6'
25-
plugin 'changelog', 'net.minecraftforge.changelog' version '3.1.3'
26-
plugin 'shadow', 'com.gradleup.shadow' version '9.2.2'
22+
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0'
23+
plugin 'gradleutils', 'net.minecraftforge.gradleutils' version '3.3.21'
24+
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.6'
25+
plugin 'changelog', 'net.minecraftforge.changelog' version '3.1.3'
26+
plugin 'shadow', 'com.gradleup.shadow' version '9.2.2'
27+
plugin 'multirelease', 'net.minecraftforge.multi-release' version '0.1.4'
2728

2829
library 'gson', 'com.google.code.gson', 'gson' version '2.11.0'
2930
library 'jopt', 'net.sf.jopt-simple', 'jopt-simple' version '6.0-alpha-3'
@@ -37,3 +38,5 @@ dependencyResolutionManagement.versionCatalogs.register('libs') {
3738
library 'nulls', 'org.jetbrains', 'annotations' version '26.0.2'
3839
}
3940
//@formatter:on
41+
42+
include 'slime-launcher-j9'

slime-launcher-j9/build.gradle

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id 'java'
3+
alias libs.plugins.gradleutils
4+
alias libs.plugins.licenser
5+
}
6+
7+
java.toolchain.languageVersion = JavaLanguageVersion.of(9)
8+
9+
license {
10+
header = rootProject.file('LICENSE-header.txt')
11+
newLine = false
12+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
module net.minecraftforge.launcher {
6+
exports net.minecraftforge.launcher;
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.launcher;
6+
7+
class DummyForModule {
8+
}

src/main/java/net/minecraftforge/launcher/Main.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.lang.invoke.MethodHandle;
2121
import java.lang.invoke.MethodHandles;
2222
import java.lang.invoke.MethodType;
23+
import java.lang.reflect.Field;
2324
import java.lang.reflect.Method;
2425
import java.util.zip.ZipEntry;
2526
import java.util.zip.ZipFile;
@@ -144,7 +145,7 @@ private static Class<?> findMainClass(String mainClass) {
144145
}
145146

146147
private static MethodHandle findMainMethod(Class<?> main) {
147-
MethodHandles.Lookup lookup = MethodHandles.lookup();
148+
MethodHandles.Lookup lookup = findLookup();
148149
try {
149150
return lookup.findStatic(main, "main", MethodType.methodType(void.class, String[].class));
150151
} catch (IllegalAccessException e) {
@@ -153,15 +154,28 @@ private static MethodHandle findMainMethod(Class<?> main) {
153154
Method mtd = main.getDeclaredMethod("main", String[].class);
154155
return lookup.unreflect(mtd);
155156
} catch (NoSuchMethodException | IllegalAccessException ex) {
156-
IllegalStateException error = new IllegalStateException("Could not find main(String[]) in " + main.getName() + '!', e);
157-
error.addSuppressed(e);
157+
IllegalStateException error = new IllegalStateException("Could not find main(String[]) in " + main.getName() + "!\r\n" +
158+
"Try running with --add-opens java.base/java.lang.invoke=ALL-UNNAMED", e);
159+
error.addSuppressed(ex);
158160
throw error;
159161
}
160162
} catch (NoSuchMethodException e) {
161163
throw new IllegalStateException("Could not find main(String[]) in " + main.getName() + '!', e);
162164
}
163165
}
164166

167+
private static MethodHandles.Lookup findLookup() {
168+
// try and find the privileged lookup, this typically needs a command line argument but it **should** detect it from our Manifest
169+
try {
170+
Field field = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
171+
field.setAccessible(true);
172+
return (MethodHandles.Lookup)field.get(null);
173+
} catch (Exception ignored) {
174+
// This is expected if we don't have --add-opens java.base/java.lang.invoke=net.minecraftforge.launcher
175+
}
176+
return MethodHandles.lookup();
177+
}
178+
165179
private static final class Launcher {
166180
private final String name;
167181
private final MethodHandle main;

0 commit comments

Comments
 (0)