从Bukkit插件修改API调用失败(IllegalAccessException)



我有一个API库,它使用Reform(和GsonConverterFactory(发送请求并将响应解析为Java对象。这运行得很好,但当我尝试从bukkit插件中使用库时,我在尝试执行请求时会遇到这个错误(同步和异步-使用bukkit异步方法和Reform enqui((方法(:

Could not pass event AsyncPlayerChatEvent to QuartersEconomy v1.0.0
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:484) [spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at net.minecraft.server.v1_11_R1.PlayerConnection.chat(PlayerConnection.java:1276) [spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:1214) [spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at net.minecraft.server.v1_11_R1.PacketPlayInChat$1.run(PacketPlayInChat.java:39) [spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.base/java.lang.Thread.run(Thread.java:830) [?:?]
Caused by: java.lang.IllegalAccessError: class retrofit2.converter.gson.GsonRequestBodyConverter tried to access private method 'com.google.gson.stream.JsonWriter com.google.gson.Gson.newJsonWriter(java.io.Writer)' (retrofit2.converter.gson.GsonRequestBodyConverter is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @4e95987c; com.google.gson.Gson is in unnamed module of loader 'app')
at retrofit2.converter.gson.GsonRequestBodyConverter.convert(GsonRequestBodyConverter.java:45) ~[?:?]
at retrofit2.converter.gson.GsonRequestBodyConverter.convert(GsonRequestBodyConverter.java:30) ~[?:?]
at retrofit2.ParameterHandler$Body.apply(ParameterHandler.java:412) ~[?:?]
at retrofit2.RequestFactory.create(RequestFactory.java:117) ~[?:?]
at retrofit2.OkHttpCall.createRawCall(OkHttpCall.java:192) ~[?:?]
at retrofit2.OkHttpCall.execute(OkHttpCall.java:175) ~[?:?]
at com.p3pi27.quarterseconomy.quarters.QuartersWrapper.executeAsync(QuartersWrapper.java:26) ~[?:?]
at com.p3pi27.quarterseconomy.auth.AuthManager.validateTypedToken(AuthManager.java:108) ~[?:?]
at com.p3pi27.quarterseconomy.auth.AuthManager.onPlayerChat(AuthManager.java:177) ~[?:?]
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.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.11.2.jar:git-Spigot-3fb9445-6e3cec8]
... 11 more

当Bukkit API调用AsyncPlayerChatEvent(然后执行函数validateToken((,在另一个类中执行executeSync((函数,此时该类仅在主线程上执行请求(时,Gson的newJsonWriter((函数似乎被阻止,因为它来自不同的模块。。。?

非常感谢您的帮助。谢谢

我没有使用Bukkit的经验,但发生这个错误是因为一个类无法访问由不同类加载器加载的另一个类的私有方法:

java.lang.IllegalAccessError:class retrofit2.converter.gson.GsonRequestBodyConverter试图访问私有方法"com.google.gson.stream.JsonWriter com.google.gson.gson.newJsonWriter(java.io.Writer("(retrofit2.converter.gson.GsonRequestBodyConverter在加载器org.bukkit.plugin.java.PluginClassLoader@4e95987c的未命名模块中;com.google.gson.gson在loader‘app’的未命名模块中(


尝试将Gson库作为部署到Bukkit的一部分加载,以便RetrofitGson都由同一类加载程序加载。

最新更新