本帖最后由 Freeze_Dolphin 于 2021-7-10 11:04 编辑
心血来潮用scala写插件
好像是一用和数组有关的东西就会报错
报错内容:
复制代码
代码:
复制代码
电脑已安装scala运行库:
之前试过用TabooLib的前置下载功能(@Dependency 注解),也这样报错
就把去掉对TabooLib的依赖了
试过把scala运行库解压了塞插件里,一样报错
心血来潮用scala写插件
好像是一用和数组有关的东西就会报错
报错内容:
- [10:23:16] [Server thread/INFO]: Freeze_Dolphin issued server command: /plainshop opn flower
- [10:23:18] [Server thread/WARN]: java.lang.reflect.InvocationTargetException
- [10:23:18] [Server thread/WARN]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- [10:23:18] [Server thread/WARN]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
- [10:23:18] [Server thread/WARN]: at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- [10:23:18] [Server thread/WARN]: at java.base/java.lang.reflect.Method.invoke(Method.java:567)
- [10:23:18] [Server thread/WARN]: at redempt.redlib.commandmanager.Command.execute(Command.java:817)
- [10:23:18] [Server thread/WARN]: at redempt.redlib.commandmanager.Command.execute(Command.java:843)
- [10:23:18] [Server thread/WARN]: at redempt.redlib.commandmanager.Command$1.execute(Command.java:502)
- [10:23:18] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159)
- [10:23:18] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_16_R3.CraftServer.dispatchCommand(CraftServer.java:826)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.PlayerConnection.handleCommand(PlayerConnection.java:2185)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.PlayerConnection.c(PlayerConnection.java:2000)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:1953)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:49)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:7)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:35)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1266)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1259)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1220)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1134)
- [10:23:18] [Server thread/WARN]: at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291)
- [10:23:18] [Server thread/WARN]: at java.base/java.lang.Thread.run(Thread.java:831)
- [10:23:18] [Server thread/WARN]: Caused by: java.lang.NoSuchMethodError: 'java.lang.Object scala.Predef$.refArrayOps(java.lang.Object[])'
- [10:23:18] [Server thread/WARN]: at io.freeze_dolphin.plain_shop.guis.UIUtl$.create(UIUtl.scala:39)
- [10:23:18] [Server thread/WARN]: at io.freeze_dolphin.plain_shop.commands.threads.OpenThread.start(OpenThread.scala:19)
- [10:23:18] [Server thread/WARN]: at io.freeze_dolphin.plain_shop.commands.CommandBus.opn(CommandBus.scala:38)
- [10:23:18] [Server thread/WARN]: ... 26 more
代码:
- package io.freeze_dolphin.plain_shop.guis
- import io.freeze_dolphin.plain_shop.PlugGividado
- import io.freeze_dolphin.plain_shop.configs.StorageUtl
- import java.io.{File, FilenameFilter}
- import org.bukkit.ChatColor
- import org.bukkit.configuration.file.YamlConfiguration
- import redempt.redlib.inventorygui.{InventoryGUI, ItemButton}
- import redempt.redlib.itemutils.ItemBuilder
- object UIUtl {
- private val eco = PlugGividado.ec
- def create(yml: YamlConfiguration): InventoryGUI = {
- import org.bukkit.Bukkit
- import redempt.redlib.inventorygui.InventoryGUI
- val id = yml.getString("id")
- val title = yml.getString("title")
- val icon = yml.getItemStack("icon")
- val border = yml.getItemStack("border")
- val gui = new InventoryGUI(Bukkit.createInventory(null, 54, color(title)))
- gui.addButton(ItemButton.create(icon, evt => {
- evt.setCancelled(true)
- }), 0, 0)
- gui.fill(1, 0, 8, 0, border)
- gui.fill(0, 1, 5, 1, border)
- gui.fill(8, 1, 8, 5, border)
- gui.fill(1, 5, 7, 5, border)
- gui.update()
- val detect = StorageUtl.isCategoryExisted(id)
- if (detect._1) {
- for (f <- new File(PlugGividado.pg.getDataFolder.getPath + File.separator + "storage" + File.separator + id).listFiles(new FilenameFilter {
- override def accept(dir: File, name: String): Boolean = {
- name.endsWith(".yml")
- }
- })
- ) {
- val yml = YamlConfiguration.loadConfiguration(f)
- val item = yml.getItemStack("item")
- val prize = yml.getDouble("prize").floatValue()
- val itm = new ItemBuilder(yml.getItemStack("item"))
- .addLore(color("&f"))
- .addLore(color(s"&7[&6>&7] &e&l价格&e: &f$prize"))
- .addLore(color("&7[&a+&7] &e左键 &f购买 1 个&f"))
- .addLore(color("&7[&a&l+&7] &eShift &7+ &e左键 &f购买 10 个&f"))
- gui.addButton(ItemButton.create(itm, evt => {
- if (evt.isCancelled) ()
- if (evt.isLeftClick) {
- if (!evt.isShiftClick) {
- val plr = Bukkit.getPlayer(evt.getWhoClicked.getUniqueId)
- val r = eco.withdrawPlayer(plr, prize)
- if (r.transactionSuccess()) {
- plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_success")))
- if (plr.getInventory.firstEmpty() == -1) {
- plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_full_inv")))
- plr.getWorld.dropItem(plr.getLocation, item)
- } else plr.getInventory.addItem(item)
- } else plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_failure")))
- } else {
- val plr = Bukkit.getPlayer(evt.getWhoClicked.getUniqueId)
- val r = eco.withdrawPlayer(plr, prize * 10)
- if (r.transactionSuccess()) {
- plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_success")))
- var invWarn = false
- for (_ <- 1 to 10) {
- if (plr.getInventory.firstEmpty() == -1) {
- invWarn = true
- plr.getWorld.dropItem(plr.getLocation, item)
- } else plr.getInventory.addItem(item)
- }
- if (invWarn) plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_full_inv")))
- } else plr.sendMessage(color(PlugGividado.cg.getConfig.getString("msg_shop_failure")))
- }
- }
- ()
- }), gui.getInventory.firstEmpty())
- gui.update()
- }
- gui.update()
- return gui
- }
- throw new IllegalArgumentException("Invalid yaml configuration!")
- }
- def color(str: String): String = {
- ChatColor.translateAlternateColorCodes('&', str)
- }
- }
电脑已安装scala运行库:

之前试过用TabooLib的前置下载功能(@Dependency 注解),也这样报错
就把去掉对TabooLib的依赖了
试过把scala运行库解压了塞插件里,一样报错
不要用电脑安装的 Scala Compiler 编译,自己在项目里依赖 Scala 版本。
个人感觉你实际生产环境使用的 Scala 版本可能不是 2.13(大概率是 2.11 什么的),但编译时用的是 2.13,所以报错了。
个人感觉你实际生产环境使用的 Scala 版本可能不是 2.13(大概率是 2.11 什么的),但编译时用的是 2.13,所以报错了。
土球球 发表于 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 于 2021-7-10 22:05 编辑
用scala编程的时候idea会报错让你Setup Scala SDK
然后那个界面我选了java11支持的最新2.13.6
之后配置我是没搞过其他版本的
土球球 发表于 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 于 2021-7-11 12:11 编辑
好像没有搞这个。。。
用scala写插件的时候编译直接吧scala源码编译成class了。。还需要加装scala运行库吗?

其实我之前试着搞过吧,
就是吧scala运行库(2.13.6)的jar里的东西全部解压出来,然后塞某个插件里
不过貌似当时没有发现起效了(?)

(题外话:)
scala是前天才开始学的,直接被它的语法迷住了,现在好像已经改不回java了qwq
至于为什么不学现在流行的kotlin。。。我也不知道为什么,就感觉对这门语言有点。。。emm嫌弃(??)
土球球 发表于 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 标准库的,嗯……