使用外部 Java/Python 库¶
PySpigot 允许您在编写脚本时使用外部 Python 和 Java 库。有许多开源的 Python 和 Java 库可以简化或加速代码编写。Apache Commons Libraries 就是一个例子,这是一个提供大量有用实用函数的 Java 实用程序库集合。
当然,更高级的功能可能包括编写您自己的外部库来处理经常使用或复杂的代码。有关更多信息,请参阅下面的 Handy Usage of External Python Modules 部分。
一般信息¶
PySpigot 在加载时将创建两个文件夹(如果不存在),分别命名为 python-libs 和 java-libs,用于存放外部库。这应该是不言自明的,但为了澄清,外部 Python 模块放在 python-libs 文件夹中,外部 Java 库放在 java-libs 文件夹中。
PySpigot 还附带了两个辅助模块:
pyspigot.py辅助模块,可以更轻松地从您的脚本中访问 PySpigot 的管理器。function.py辅助模块,将java.util.function包中的几个函数接口封装起来,以便更轻松地处理使用函数接口的库(例如 NBT-API)。
这两个模块都打包在 PySpigot 的 JAR 文件中,并可通过简单导入来访问。
外部 Python 库¶
PySpigot目前支持使用单模块文件作为外部库。目前,不支持完整的库/包(即具有__init__.py的库),但计划在未来版本中支持这些。因此,从现在开始,“外部Python库”将被称为模块。
加载和使用外部Python模块¶
使用外部Python模块相对简单,不需要使用PySpigot的任何管理器或命令,不像Java库那样。您打算使用的外部Python模块应该是一个单独的.py文件。要使用它,请将其拖放到PySpigot主插件文件夹中的python-libs文件夹中。然后,简单地将该模块import到您的脚本中,然后您就可以开始使用了。
提示
添加新模块或删除旧模块不需要服务器重新启动或重新加载插件。但是,如果更改了模块的代码,则应重新加载使用该模块的所有脚本。
使用外部Python模块的便利性¶
假设有一段代码在多个脚本中经常使用。这段代码可能是将玩家位置转换为适合配置的dict,格式化str或以整洁的格式发送玩家消息。您可能考虑将此代码从不同脚本中多次编写,将其拆分为自己的外部Python模块,然后将其添加到python-libs文件夹中,以便您可以从所有脚本中访问它。
在正常情况下,一个 Java 库会被“shaded”到一个 Bukkit/Spigot 插件中(最终结果有时被称为“fat” Jar 或 “Uber” Jar),以便插件在运行时可以访问依赖项。显然,我们无法对脚本进行此操作。
相反,我们可以利用 Jython 的功能。正如文档中其他地方已经提到的,Jython 提供了对运行时加载的所有 Java 类的访问权限。因此,一组 Java 类(即库)可以在运行时手动加载到类路径中,从而使脚本可以访问这些类。PySpigot 的 LibraryManager 提供了这种功能。
当加载一个 JAR 库时,PySpigot 会创建一个以“-relocated”结尾的库的副本。例如,库 jython-annotation-tools-0.9.0.jar 会复制为 jython-annotation-tools-0.9.0-relocated.jar。这不仅是为了适应重新定位规则(请参阅下面的重新定位规则部分),还为了加快未来插件加载时外部库的加载速度。即使您没有为库指定任何重新定位规则,这种行为也会发生。
加载和使用 Java 库¶
警告
可能另一个服务器上的插件已经在使用您想要使用的库/依赖项。在尝试自己加载库之前,您应该检查这是否是真的。您可以通过尝试在脚本中 import 该依赖项来实现这一点。如果您能够导入它,在此停止! 您不需要自行加载它,因为它已经被加载(很可能是由其他插件加载的)。
所有Java库/依赖应该能在某个地方下载到Jar文件,可能在其Github仓库或官方网站上。您可能需要手动从托管依赖的仓库下载它。如果找不到Jar文件,请在PySpigot的Discord上寻求帮助。
一旦您拥有了想要使用的依赖的实际Jar文件,请将其拖放到主PySpigot插件文件夹的java-libs文件夹中。当加载PySpigot插件并启用时(服务器启动时),将加载该依赖。从这里,您可以在脚本中使用import语句来导入库中所需的代码。
提示
所有存在于java-libs文件夹中的Jar文件在插件加载时都会被加载(服务器启动时)。在PySpigot已经运行时加载新的Jar文件需要使用一个命令(见下文),或完全重新加载插件(/ps reloadall)。
在PySpigot已在运行时加载Java库¶
与之前一样,请获取您想要使用的库的Jar文件。然后,将其拖放到主PySpigot插件文件夹的java-libs文件夹中。
接下来,您需要使用命令/ps loadlibrary <filename>手动加载库,其中 <filename> 是您加载的Jar文件的名称。请确保在文件名中包含.jar扩展名。这将导入库。
库现在应该已加载,您可以使用import语句来导入所需的代码。
注意
由于Java类加载系统的限制,PySpigot没有一种方法可以卸载先前加载的库。尽管如此,库不会被加载多次;如果已加载,PySpigot将不会再次加载它。
Jar迁移规则¶
您可能需要更改库/依赖项中类的名称/类路径。这被称为“重定位”。您可能有很多理由想要这样做,但这超出了本文档的范围。如果您需要重新定位库/依赖项的类路径,您可能已经知道需要这样做了。在这种情况下,请继续阅读有关如何指定重定位规则的信息。
在PySpigot的config.yml中,您会找到library-relocations值。您可以在这里指定自己的重定位规则。重定位规则应采用<path>|<relocated-path>的格式。例如,将com.apache.commons.lang3.stringutils重新定位为lib.com.apache.commons.lang3.stringutils:
1 2 3 4 5 | |
缩写的列表形式也可在YAML语法中使用:
1 2 3 4 | |
要在缩写的列表形式中添加多个重定位规则,请用逗号分隔每个规则。
Tip
正如之前所述,PySpigot会为每个外部JAR库创建一个以"-relocated"结尾的副本。该文件代表了重定位后的JAR,其中应用了所有的重定位规则。此副本仅被创建一次,换句话说,重定位规则仅被应用一次。在后续插件加载中,将加载重定位后的JAR库。
因此,如果更改了重定位规则,就有必要删除相关库的"-relocated.jar"副本,以便应用更新后的重定位规则。