Java 改造2,maven项目,非法反射进入警告

Java 改造2,maven项目,非法反射进入警告,java,retrofit,Java,Retrofit,我刚刚启动了一个新的maven项目,并对改造客户端进行了简单的实现。我收到以下警告: 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

我刚刚启动了一个新的maven项目,并对改造客户端进行了简单的实现。我收到以下警告:

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();
}
2.调用;
导入文件2.http.GET;
公共接口端点{
@获取(“测试状态”)
调用testStatus();
}
这个电话是这样的:

EndPoints endPoints = RetrofitClient.getAPI("http://localhost:8080/");
Call<String> repos = endPoints.testStatus();
System.out.println(repos.execute());
java --add-opens=java.base/java.lang.invoke=ALL_UNNAMED my_jar.jar
EndPoints EndPoints=client.getAPI(“http://localhost:8080/");
调用repos=endPoints.testStatus();
System.out.println(repos.execute());

该项目使用SDK 11运行java语言11级。今天我遇到了同样的错误。我将改造2.8.1导入到我的项目中,它出现了。我尝试了所有的方法,但有一件事很有帮助——我把我的改型版本改成了2.7.2,现在一切都正常了。祝你好运 如果您使用maven:

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.7.2</version>
</dependency>
有一份关于它的文件,其中一位改装维护人员对此作出了回应:

反射解决了JDK中的一个bug,该bug在14年被修复,但它只用于默认方法。因为这只是一个警告,并不妨碍你的电话工作

所以你的选择是

  • 坚持使用改装2.8.x,并
    • 忽略警告,或
    • 升级到Java14
  • 降级至改装2.7。*

  • 如果您的Java版本介于9和13之间,并且希望继续使用2.8或更高版本的改型版本,则可以如下方式运行jar文件:

    EndPoints endPoints = RetrofitClient.getAPI("http://localhost:8080/");
    Call<String> repos = endPoints.testStatus();
    System.out.println(repos.execute());
    
    java --add-opens=java.base/java.lang.invoke=ALL_UNNAMED my_jar.jar
    
    请注意,这在Java 8上不起作用,因此如果您确实需要,您可以构建这样的解决方案(在*nix上工作):

    如果你有兴趣进一步研究这个问题,你可以看看

    我还发现这有一些很好的信息:


    如果您使用的是Gradle,还可以尝试添加默认jvm参数:。然而,这仍然不能让您得到一个简单的jar文件,它可以正常工作。

    使用版本时要小心。
    降级到改型2.7。*为我解决了这个问题

    为什么改型2.8.X对JDK>=14没有硬依赖,这会给您带来更好的错误?这在Java land是不可能的吗?猜猜看:虽然这肯定是可能的,至少在Maven和的情况下,改型制造商可能只是不想将