Retrofit2, maven project, Illegal reflective access warning
today I have got the same error. I imported Retrofit 2.8.1 to my project and it appeared. I tried everything, but one thing helped - I changed my Retrofit version to 2.7.2 and now everything works. Good luck!) If you use maven:
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.7.2</version>
</dependency>
Gradle:
compile group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.7.2'
I've added this block to my module build.gradle
file.
Gradle
tasks.withType(Test) {
/**
* fix for retrofit https://github.com/square/retrofit/issues/3341
*/
jvmArgs = ["--add-opens", "java.base/java.lang.invoke=ALL-UNNAMED"]
}
Kotlin DSL
tasks.withType<Test> {
/**
* fix for retrofit https://github.com/square/retrofit/issues/3341
*/
jvmArgs = listOf("--add-opens", "java.base/java.lang.invoke=ALL-UNNAMED")
}
and the warning is not showing anymore. I think it's safe to remove it in this way because it is affecting test tasks only
If you are between Java versions 9 and 13 and want to stick with Retrofit versions at or higher than 2.8, you can run your jar file like this:
java --add-opens=java.base/java.lang.invoke=ALL_UNNAMED my_jar.jar
Note that this won't work on Java 8, so if you really need to, you can hack up a solution like this (works on *nix):
if java --add-opens 2>&1 | grep 'requires modules' >/dev/null; then
java --add-opens=java.base/java.lang.invoke=ALL-UNNAMED -jar my_jar.jar
else
java -jar my_jar.jar
fi
If you're interested in looking into this further, you can look at the code that causes this.
I also found that this has some good information: https://blog.codefx.org/java/five-command-line-options-hack-java-module-system/
If you're using Gradle, you might also try adding default jvm args: How do I add default JVM arguments with Gradle. However, that still doesn't get you a plain jar file that just works.
There was an issue filed about this, to which one of the Retrofit maintainers responded:
The reflection works around a bug in the JDK which was fixed in 14 but it's only used for default methods. As it's only a warning, it's not preventing your call from working.
So your options are either to
- stick with Retrofit 2.8.x, and
- ignore the warning, or
- upgrade to Java 14
- downgrade to Retrofit 2.7.*