Java 8 to 17 upgrade issue : java.lang.IllegalAccessError

2.7k Views Asked by At

I am trying to upgrade a project from Java 8 to Java 17. I am getting following error when to trying to bring up the service and not sure how to fix it. I have searched for java.lang.IllegalAccessError issues and all I see are related to Powermock. Javassist library is not explicitly specified, but Gradle using the latest version available(org.javassist:javassist:3.28.0-GA) and I don't see multiple versions loaded. I tried --illegal-access=permit VM option, but didn't work. Any ideas or suggestion? Thanks in advance.

As part of Java 8 to 17 upgrade, I upgraded all the important libraries to the latest version including Dropwizard framework suit, Lombok, Apache Spark, Swagger, and etc.

java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by com.company.custom.metadata.run.CompanyLoader @f2ff811 cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877)
    at javassist.Loader.findClass(Loader.java:419)
    at javassist.Loader.loadClass(Loader.java:350)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.System$2.defineClass(System.java:2189)
    at java.base/jdk.internal.reflect.ClassDefiner.defineClass(ClassDefiner.java:65)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:400)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:310)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:55)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2573)
    at org.jboss.logging.Logger.getMessageLogger(Logger.java:2530)
    at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
    at org.hibernate.validator.internal.util.logging.LoggerFactory.make(LoggerFactory.java:22)
    at org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.<clinit>(ValidatorFactoryConfigurationHelper.java:51)
    at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:135)
    at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
    at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.buildValidatorFactory(AbstractConfigurationImpl.java:433)
    at io.dropwizard.jersey.validation.Validators.newValidatorFactory(Validators.java:26)
    at io.dropwizard.setup.Bootstrap.<init>(Bootstrap.java:67)
    at io.dropwizard.Application.run(Application.java:86)
    at com.company.api.CompanyService.main(CompanyService.java:571)
    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 javassist.Loader.run(Loader.java:328)
    at com.company.custom.metadata.CompanyServiceRun.run(CompanyServiceRun.java:151)
    at com.company.custom.metadata.CompanyServiceRun.main(CompanyServiceRun.java:198)

Edit: As per the suggestion, now I am upgrading my project to Java 17. But I still got the same error and stack trace.

1

There are 1 best solutions below

0
paulsm4 On

This is the problem:

https://learn.microsoft.com/en-us/java/openjdk/transition-from-java-8-to-java-11

In Java 11, using reflection to access to JDK-internal API will result in an illegal reflective access warning. By default, the warning is only issued for the first illegal access. Setting --illegal-access=warn will cause a warning on every illegal reflective access. You will find more case if illegal access with the option set to warn. But you will also get a lot of redundant warnings. Once the application runs on Java 11, set --illegal-access=deny to mimic the future behavior of the Java runtime. Starting with Java 16, the default will be --illegal-access=deny.

Up thorugh Java 16, the workaround has been --illegal-access=permit, but apparently that's no longer an option:

https://github.com/NationalSecurityAgency/ghidra/issues/3355

JDK 17: --illegal-access=permit removed #3355

This post discusses the background behind and rationale for introducing this "breaking change":

https://blogs.oracle.com/javamagazine/post/a-peek-into-java-17-continuing-the-drive-to-encapsulate-the-java-runtime-internals