Freeze_Dolphin
本帖最后由 Freeze_Dolphin 于 2021-7-10 11:04 编辑

此主题有 Markdown 版本,请在附件下载

此主题在 你问我答 板块同时发布,在此解决后可以去该帖寻求采纳

心血来潮用scala写插件

好像是一用和数组有关的东西就会报错

报错内容:
  1. [10:23:16] [Server thread/INFO]: Freeze_Dolphin issued server command: /plainshop opn flower
  2. [10:23:18] [Server thread/WARN]: java.lang.reflect.InvocationTargetException
  3. [10:23:18] [Server thread/WARN]:         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. [10:23:18] [Server thread/WARN]:         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
  5. [10:23:18] [Server thread/WARN]:         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. [10:23:18] [Server thread/WARN]:         at java.base/java.lang.reflect.Method.invoke(Method.java:567)
  7. [10:23:18] [Server thread/WARN]:         at redempt.redlib.commandmanager.Command.execute(Command.java:817)
  8. [10:23:18] [Server thread/WARN]:         at redempt.redlib.commandmanager.Command.execute(Command.java:843)
  9. [10:23:18] [Server thread/WARN]:         at redempt.redlib.commandmanager.Command$1.execute(Command.java:502)
  10. [10:23:18] [Server thread/WARN]:         at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159)
  11. [10:23:18] [Server thread/WARN]:         at org.bukkit.craftbukkit.v1_16_R3.CraftServer.dispatchCommand(CraftServer.java:826)
  12. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.PlayerConnection.handleCommand(PlayerConnection.java:2185)
  13. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.PlayerConnection.c(PlayerConnection.java:2000)
  14. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:1953)
  15. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:49)
  16. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:7)
  17. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:35)
  18. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18)
  19. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136)
  20. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23)
  21. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109)
  22. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1266)
  23. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1259)
  24. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119)
  25. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1220)
  26. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1134)
  27. [10:23:18] [Server thread/WARN]:         at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291)
  28. [10:23:18] [Server thread/WARN]:         at java.base/java.lang.Thread.run(Thread.java:831)
  29. [10:23:18] [Server thread/WARN]: Caused by: java.lang.NoSuchMethodError: 'java.lang.Object scala.Predef$.refArrayOps(java.lang.Object[])'
  30. [10:23:18] [Server thread/WARN]:         at io.freeze_dolphin.plain_shop.guis.UIUtl$.create(UIUtl.scala:39)
  31. [10:23:18] [Server thread/WARN]:         at io.freeze_dolphin.plain_shop.commands.threads.OpenThread.start(OpenThread.scala:19)
  32. [10:23:18] [Server thread/WARN]:         at io.freeze_dolphin.plain_shop.commands.CommandBus.opn(CommandBus.scala:38)
  33. [10:23:18] [Server thread/WARN]:         ... 26 more
复制代码


代码:
  1. package io.freeze_dolphin.plain_shop.guis

  2. import io.freeze_dolphin.plain_shop.PlugGividado
  3. import io.freeze_dolphin.plain_shop.configs.StorageUtl
  4. import java.io.{File, FilenameFilter}
  5. import org.bukkit.ChatColor
  6. import org.bukkit.configuration.file.YamlConfiguration
  7. import redempt.redlib.inventorygui.{InventoryGUI, ItemButton}
  8. import redempt.redlib.itemutils.ItemBuilder

  9. object UIUtl {

  10.     private val eco = PlugGividado.ec

  11.     def create(yml: YamlConfiguration): InventoryGUI = {
  12.         import org.bukkit.Bukkit
  13.         import redempt.redlib.inventorygui.InventoryGUI

  14.         val id = yml.getString("id")
  15.         val title = yml.getString("title")
  16.         val icon = yml.getItemStack("icon")
  17.         val border = yml.getItemStack("border")

  18.         val gui = new InventoryGUI(Bukkit.createInventory(null, 54, color(title)))

  19.         gui.addButton(ItemButton.create(icon, evt => {
  20.             evt.setCancelled(true)
  21.         }), 0, 0)

  22.         gui.fill(1, 0, 8, 0, border)
  23.         gui.fill(0, 1, 5, 1, border)
  24.         gui.fill(8, 1, 8, 5, border)
  25.         gui.fill(1, 5, 7, 5, border)

  26.         gui.update()

  27.         val detect = StorageUtl.isCategoryExisted(id)
  28.         if (detect._1) {
  29.             for (f <- new File(PlugGividado.pg.getDataFolder.getPath + File.separator + "storage" + File.separator + id).listFiles(new FilenameFilter {
  30.                 override def accept(dir: File, name: String): Boolean = {
  31.                     name.endsWith(".yml")
  32.                 }
  33.             })
  34.                  ) {
  35.                 val yml = YamlConfiguration.loadConfiguration(f)
  36.                 val item = yml.getItemStack("item")
  37.                 val prize = yml.getDouble("prize").floatValue()
  38.                 val itm = new ItemBuilder(yml.getItemStack("item"))
  39.                         .addLore(color("&f"))
  40.                         .addLore(color(s"&7[&6>&7] &e&l价格&e: &f$prize"))
  41.                         .addLore(color("&7[&a+&7] &e左键 &f购买 1 个&f"))
  42.                         .addLore(color("&7[&a&l+&7] &eShift &7+ &e左键 &f购买 10 个&f"))
  43.                 gui.addButton(ItemButton.create(itm, evt => {
  44.                     if (evt.isCancelled) ()
  45.                     if (evt.isLeftClick) {
  46.                         if (!evt.isShiftClick) {
  47.                             val plr = Bukkit.getPlayer(evt.getWhoClicked.getUniqueId)
  48.                             val r = eco.withdrawPlayer(plr, prize)
  49.                             if (r.transactionSuccess()) {
  50.                                 plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_success")))
  51.                                 if (plr.getInventory.firstEmpty() == -1) {
  52.                                     plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_full_inv")))
  53.                                     plr.getWorld.dropItem(plr.getLocation, item)
  54.                                 } else plr.getInventory.addItem(item)
  55.                             } else plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_failure")))
  56.                         } else {
  57.                             val plr = Bukkit.getPlayer(evt.getWhoClicked.getUniqueId)
  58.                             val r = eco.withdrawPlayer(plr, prize * 10)
  59.                             if (r.transactionSuccess()) {
  60.                                 plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_success")))

  61.                                 var invWarn = false
  62.                                 for (_ <- 1 to 10) {
  63.                                     if (plr.getInventory.firstEmpty() == -1) {
  64.                                         invWarn = true
  65.                                         plr.getWorld.dropItem(plr.getLocation, item)
  66.                                     } else plr.getInventory.addItem(item)
  67.                                 }
  68.                                 if (invWarn) plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_full_inv")))
  69.                             } else plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_failure")))
  70.                         }
  71.                     }
  72.                     ()
  73.                 }), gui.getInventory.firstEmpty())
  74.                 gui.update()
  75.             }
  76.             gui.update()
  77.             return gui
  78.         }
  79.         throw new IllegalArgumentException("Invalid yaml configuration!")
  80.     }

  81.     def color(str: String): String = {
  82.         ChatColor.translateAlternateColorCodes('&', str)
  83.     }

  84. }
复制代码


电脑已安装scala运行库:



之前试过用TabooLib的前置下载功能(@Dependency 注解),也这样报错
就把去掉对TabooLib的依赖了

试过把scala运行库解压了塞插件里,一样报错

土球球
不要用电脑安装的 Scala Compiler 编译,自己在项目里依赖 Scala 版本。

个人感觉你实际生产环境使用的 Scala 版本可能不是 2.13(大概率是 2.11 什么的),但编译时用的是 2.13,所以报错了。

Freeze_Dolphin
土球球 发表于 2021-7-10 16:11
不要用电脑安装的 Scala Compiler 编译,自己在项目里依赖 Scala 版本。

个人感觉你实际生产环境使用的 Sc ...

idea里设置的是2.13.6
我就根据他的提示写出来的

一般用起来都不会这么报错
就是一碰到和循坏、遍历这类就出这个报错

看报错貌似是对数组的处理造成的
之前用scala谢了个不定参数的函数,也这么报错

现在我已经把有关的类用java翻译了
于是就出现了一半用scala一半用java的情况awa(第一次搞混合语言的项目):



土球球
Freeze_Dolphin 发表于 2021-7-10 18:13
idea里设置的是2.13.6
我就根据他的提示写出来的

那么你确认过你实际生产环境使用的 Scala 版本吗,你是如何将 Scala 标准库引入的?

Freeze_Dolphin
本帖最后由 Freeze_Dolphin 于 2021-7-10 22:05 编辑
土球球 发表于 2021-7-10 19:09
那么你确认过你实际生产环境使用的 Scala 版本吗,你是如何将 Scala 标准库引入的? ...

用scala编程的时候idea会报错让你Setup Scala SDK
然后那个界面我选了java11支持的最新2.13.6

之后配置我是没搞过其他版本的





土球球
Freeze_Dolphin 发表于 2021-7-10 22:03
用scala编程的时候idea会报错让你Setup Scala SDK
然后那个界面我选了java11支持的最新2.13.6

不不不……我说的是生产环境,你刚刚说的这些全都是开发环境。

你的插件在加进服务端运行时肯定要找 scala 标准库也就是 scala.* 底下的东西,楼主你没有说清楚这些东西你是怎么加载进你测试的服务端的。

Freeze_Dolphin
本帖最后由 Freeze_Dolphin 于 2021-7-11 12:11 编辑
土球球 发表于 2021-7-10 23:44
不不不……我说的是生产环境,你刚刚说的这些全都是开发环境。

你的插件在加进服务端运行时肯定要找 scal ...

好像没有搞这个。。。

用scala写插件的时候编译直接吧scala源码编译成class了。。还需要加装scala运行库吗?




其实我之前试着搞过吧,
就是吧scala运行库(2.13.6)的jar里的东西全部解压出来,然后塞某个插件里

不过貌似当时没有发现起效了(?)




(题外话:)
scala是前天才开始学的,直接被它的语法迷住了,现在好像已经改不回java了qwq
至于为什么不学现在流行的kotlin。。。我也不知道为什么,就感觉对这门语言有点。。。emm嫌弃(??)

土球球
Freeze_Dolphin 发表于 2021-7-11 11:54
好像没有搞这个。。。

用scala写插件的时候编译直接吧scala源码编译成class了。。还需要加装scala运行库 ...

需要加装。把 Scala 标准库 jar 里的东西直接解压进去也行……不过这种事一般 maven/gradle 插件都可以帮你代劳,gradle 可以用 shadow plugin,maven 不清楚。

另外,你塞的插件和你用 Scala 的插件需要是同一个,不同插件之间是存在类加载隔离的。

另外,你就算用 kotlin,也是需要加装 kotlin 标准库的,嗯……

第一页 上一页 下一页 最后一页