提问人:Freeze Dolphin 提问时间:6/14/2023 最后编辑:amalloyFreeze Dolphin 更新时间:6/15/2023 访问量:70
服务器插件开发中的 Clojure:调用服务器启动后必须初始化的类
Clojure in server plugin dev: calling classes that must be initialized after server startup
问:
我是 clojure 的新手。.
假设服务器通过在运行时加载 jar 文件来加载插件。
服务器本身有许多类,必须在服务器启动后进行初始化。(这些类将检查服务器是否在构建时运行......
clojure 能参与这样的场景吗?
以下是详细的
我想创建一个 Slimefun 插件。我只想使用 clojure 来设置项目
但众所周知,在Minecraft开发中,几乎所有的东西都应该在服务器启动后才进行初始化,并且类在构建时也会检查服务器是否在运行(例如ItemStack
)
在 clojure 编译过程中,代码似乎被执行了。(我不知道这是否正确......这意味着如果我的代码涉及诸如 之类的类,那么编译将失败。ItemStack
那么,如果我想开发涉及 Clojure 的 spigot 插件,我该怎么办?
编译日志:
freeze-dolphin@stardust:~/Documents/workspace/idea/Dumortierite/clj-module$ lein jar
Compiling io.sn.dumortierite.clj-module.items
Reflection warning, io/sn/dumortierite/clj_module/items.clj:15:1 - call to io.github.thebusybiscuit.slimefun4.api.items.SlimefunItemStack ctor can't be resolved.
Syntax error macroexpanding def at (items.clj:15:1).
Execution error (NullPointerException) at org.bukkit.Bukkit/getItemFactory (Bukkit.java:1831).
Cannot invoke "org.bukkit.Server.getItemFactory()" because "org.bukkit.Bukkit.server" is null
Full report at:
/tmp/clojure-2943387361270522517.edn
Compilation failed: Subprocess failed (exit code: 1)
以下是报告全文: https://pastebin.com/xzmxHp5q
此外,如果对如何结合 leiningen 和 gradle 感兴趣,您可以查看上面使用的 repo: https://github.com/freeze-dolphin/Dumortierite/tree/master/clj-module
答:
我不熟悉 Minecraft 等,但你可以用 Java 做的任何事情也可以用 Clojure 完成。如果你知道如何编写一个 Java “插件”,你应该能够使用一个瘦的 Java“桥接”来“轻松地”将其转换为 Clojure。
所有细节都在这个问题中描述。
另请参阅此问题。
评论
感谢您包含完整的堆栈跟踪 - 很多新手没有,这非常令人沮丧,因为它总是包含有用的信息。在这种情况下,它表明,不出所料,cfrick的猜测是正确的。具体来说,在第 15 行,您已经写了items.clj
(def something (whatever (org.bukkit.Bukkit/getItemFactory)))
这意味着,在编译过程中,您正在调用 .一般来说,在编译过程中,你应该依赖很少的东西。顶级 defs 应该只使用函数、数字、字符串、序列,诸如此类的轻量级内容。在运行时之前不需要的任何内容都应该被推迟,通常是通过将其放在由以下定义下的函数中:getItemFactory
defn
(defn something [args] (whatever (org.bukkit.Bukkit/getItemFactory)))
只有在准备好运行初始化代码后,才能在运行时调用它。
如果你需要一些类似变量的东西,尽管它的依赖关系很昂贵,当然你不希望每次调用它所包含的函数时都初始化它。最简单的解决方案是使用:delay
(def something (delay (whatever ...)))
然后,使用 取消引用它,它仅在您第一次取消引用它时调用它。@something
whatever
评论
def