Skip to content

Commit e62c38b

Browse files
committed
The hack for modifying a final field doesn't work on Java 12 and newer
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal net.orfjackal.retrolambda:retrolambda-maven-plugin:2.5.7-SNAPSHOT:process-main (default) on project end-to-end-tests: Failed to run Retrolambda at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216) at org.apache.maven.cli.MavenCli.main(MavenCli.java:160) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Caused by: org.apache.maven.plugin.MojoExecutionException: Failed to run Retrolambda at net.orfjackal.retrolambda.maven.ProcessClassesMojo.processClassesInCurrentProcess(ProcessClassesMojo.java:161) at net.orfjackal.retrolambda.maven.ProcessClassesMojo.execute(ProcessClassesMojo.java:133) at net.orfjackal.retrolambda.maven.ProcessMainClassesMojo.execute(ProcessMainClassesMojo.java:17) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) ... 19 more Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at net.orfjackal.retrolambda.maven.ProcessClassesMojo.processClassesInCurrentProcess(ProcessClassesMojo.java:157) ... 23 more Caused by: java.lang.IllegalStateException: Cannot initialize dumper; unexpected JDK implementation. Please run Retrolambda using the Java agent (enable forking in the Maven plugin). at net.orfjackal.retrolambda.lambdas.LambdaClassDumper.install(LambdaClassDumper.java:38) at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:67) at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:25) ... 28 more Suppressed: java.lang.RuntimeException: java.lang.IllegalAccessException: class net.orfjackal.retrolambda.lambdas.LambdaClassDumper cannot access a member of class java.lang.invoke.InnerClassLambdaMetafactory (in module java.base) with modifiers "private static final" at net.orfjackal.retrolambda.lambdas.LambdaClassDumper.uninstall(LambdaClassDumper.java:48) at net.orfjackal.retrolambda.lambdas.LambdaClassDumper.close(LambdaClassDumper.java:55) at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:102) ... 29 more Caused by: java.lang.IllegalAccessException: class net.orfjackal.retrolambda.lambdas.LambdaClassDumper cannot access a member of class java.lang.invoke.InnerClassLambdaMetafactory (in module java.base) with modifiers "private static final" at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376) at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:639) at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075) at java.base/java.lang.reflect.Field.set(Field.java:778) at net.orfjackal.retrolambda.lambdas.LambdaClassDumper.uninstall(LambdaClassDumper.java:46) ... 31 more Caused by: java.lang.NoSuchFieldException: modifiers at java.base/java.lang.Class.getDeclaredField(Class.java:2416) at net.orfjackal.retrolambda.lambdas.LambdaClassDumper.makeNonFinal(LambdaClassDumper.java:59) at net.orfjackal.retrolambda.lambdas.LambdaClassDumper.install(LambdaClassDumper.java:32) ... 30 more
1 parent 0842425 commit e62c38b

File tree

3 files changed

+17
-12
lines changed

3 files changed

+17
-12
lines changed

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ yourself or pay someone to do it, if you think it's worth the effort. ;)
241241
Version History
242242
---------------
243243

244+
### Upcoming
245+
246+
- Improved error messages for Java 12 and newer, which have been confirmed
247+
to not work without the Java agent
248+
244249
### Retrolambda 2.5.6 (2018-11-30)
245250

246251
- Fix a `NullPointerException` crash in the Maven plugin on Java 10 & 11

retrolambda/src/main/java/net/orfjackal/retrolambda/lambdas/LambdaClassDumper.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2013-2014 Esko Luontola <www.orfjackal.net>
1+
// Copyright © 2013-2020 Esko Luontola and other Retrolambda contributors
22
// This software is released under the Apache License 2.0.
33
// The license text is at http://www.apache.org/licenses/LICENSE-2.0
44

@@ -56,10 +56,16 @@ public void close() {
5656
}
5757

5858
private static void makeNonFinal(Field field) throws Exception {
59-
Field modifiers = field.getClass().getDeclaredField("modifiers");
60-
modifiers.setAccessible(true);
61-
int mod = modifiers.getInt(field);
62-
modifiers.setInt(field, mod & ~Modifier.FINAL);
59+
try {
60+
Field modifiers = field.getClass().getDeclaredField("modifiers");
61+
modifiers.setAccessible(true);
62+
int mod = modifiers.getInt(field);
63+
modifiers.setInt(field, mod & ~Modifier.FINAL);
64+
} catch (NoSuchFieldException e) {
65+
throw new RuntimeException("Failed to make a field non-final (" + field + "). " +
66+
"This known to fail on Java 12 and newer. Prefer using Java 8 or try using the Java agent " +
67+
"(fork=true in the Maven plugin).", e);
68+
}
6369
}
6470

6571
private static Object newProxyClassesDumper(Path dumpDir) throws Exception {

scripts/build.sh

+1-7
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,7 @@ JAVA_HOME="$JAVA11_HOME" mvn clean verify \
8383
--errors \
8484
| tee build.log && check_build_log
8585

86-
JAVA_HOME="$JAVA12_HOME" mvn clean verify \
87-
--errors \
88-
| tee build.log && check_build_log
89-
90-
JAVA_HOME="$JAVA13_HOME" mvn clean verify \
91-
--errors \
92-
| tee build.log && check_build_log
86+
# (Java 12+ fails without forking because java.lang.invoke.InnerClassLambdaMetafactory#dumper cannot be made non-final)
9387

9488
# Make sure that the Java agent works on all new Java versions
9589

0 commit comments

Comments
 (0)