Retrofit2, проект Maven, предупреждение о незаконном отражении доступа - PullRequest
2 голосов
/ 29 марта 2020

Я только начал новый проект maven и выполнил простую реализацию клиента Retrofit. Я получаю следующие предупреждения:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by retrofit2.Platform (file:/C:/Users/Admin/.m2/repository/com/squareup/retrofit2/retrofit/2.8.1/retrofit-2.8.1.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of retrofit2.Platform
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Process finished with exit code 0

вот код

import retrofit2.Retrofit;
import retrofit2.SimpleXmlConverterFactory;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

public class RetrofitClient {

    private static Retrofit retrofit = null;
    private RetrofitClient() { }

    public static EndPoints getAPI(String baseUrl) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(SimpleXmlConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
        }
        return retrofit.create(EndPoints.class);
    }
}

Интерфейс просто

import retrofit2.Call;
import retrofit2.http.GET;

public interface EndPoints {
    @GET("teststatuses")
    Call<String> testStatus();
}

Звонок выглядит так:

EndPoints endPoints = RetrofitClient.getAPI("http://localhost:8080/");
Call<String> repos = endPoints.testStatus();
System.out.println(repos.execute());

Проект работает java на уровне языка 11 с SDK 11

Ответы [ 3 ]

2 голосов
/ 03 апреля 2020

сегодня у меня такая же ошибка. Я импортировал Retrofit 2.8.1 в свой проект, и он появился. Я перепробовал все, но помогло одно - я изменил свою версию Retrofit на 2.7.2 и теперь все работает. Удачи!) Если вы используете 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'
1 голос
/ 04 мая 2020

Если вы находитесь между Java версиями 9 и 13 и хотите придерживаться версий Retrofit версии 2.8 или выше, вы можете запустить файл jar следующим образом:

java --add-opens=java.base/java.lang.invoke=ALL_UNNAMED my_jar.jar

Обратите внимание, что это победило ' t работает на Java 8, поэтому, если вам действительно нужно, вы можете взломать решение, подобное этому (работает на * 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

Если вы заинтересованы в рассмотрении этого вопроса, Вы можете посмотреть на код, который вызывает это .

Я также обнаружил, что здесь есть некоторая полезная информация: https://blog.codefx.org/java/five-command-line-options-hack-java-module-system/

Если вы ' При использовании Gradle вы также можете попробовать добавить стандартные аргументы jvm: Как добавить стандартные аргументы JVM с Gradle . Однако, это все еще не дает вам простой jar-файл, который просто работает.

1 голос
/ 16 апреля 2020

Существует проблема , поданная об этом, на что один из сопровождающих Retrofit ответил:

Отражение работает вокруг ошибки в JDK, которая была исправлена ​​в 14, но это используется только для методов по умолчанию. Поскольку это всего лишь предупреждение, оно не мешает вашему вызову работать.

Таким образом, вы можете либо

  1. придерживаться Retrofit 2.8.x, либо
    • игнорировать предупреждение или
    • обновить до Java 14
  2. понизить до Retrofit 2.7. *
...