[插件] 动态加载依赖库 分享 - 编程开发 - Minecraft(我的世界)中文论坛 -.html

[插件] 动态加载依赖库 分享 - 编程开发 - Minecraft(我的世界)中文论坛 -

Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 605|回复: 11
打印 上一主题 下一主题

[开发资源] [插件] 动态加载依赖库 分享

[复制链接]
结冰的离季 当前离线
积分
4304
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-1-27
查看详细资料

来自:广东

跳转到指定楼层
楼主
发表于 2022-6-9 23:18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 结冰的离季 于 2022-6-9 23:23 编辑

从spigot 1.16.5 开始插件可以在plugin.yml 中声明依赖,在插件加载时由服务端加载依赖,这样可以很好地解决不同插件对同一依赖的不同版本的冲突问题。

但是很可惜低版本并不能这样,很多大型插件比如 luckperm taobblib 等都具有这样的功能,目的就是兼容性,和减小体积。
进过我的一番寻找之后发现了一个有这功能的库  https://github.com/Revxrsal/PluginLib 功能很丰富
可以以yml xml 直链或者代码的方式来加载依赖
比如
  1. kotlin-stdlib:
  2.   repository: https://maven.aliyun.com/repository/public
  3.   groupId: org.jetbrains.kotlin
  4.   artifactId: kotlin-stdlib
  5.   version: 1.6.21
复制代码
比spigot多了个指定仓库地址的功能,这点就很不错,可以使用国内的镜像加速下载。

但是这个库已经不更新了,高版本会报错,所以经过我的魔改之后我来分享给大家
  • 剔除了没用的relocate功能(对我来说)
  • 缩小体积为单java文件
  • 兼容所有版本mc 和 jdk1.8以上的版本


DependencyLoader.rar (4.28 KB, 下载次数: 16)


使用方法
1. 把DependencyLoader.java 丢进项目


2. 在任何你想要的地方调用 DependencyLoader.loadLibs(); 方法 这个方法是加载plugin.yml 中的依赖,
推荐是在插件主类的static{}代码块中


3.配置plugin.yml 举个例子


"@Server:" 前缀表示在服务端文件夹下,不加就是在插件配置文件夹下,储存格式与高版本一样,都是

"libraries\org\jetbrains\kotlin\kotlin-stdlib\1.6.21\kotlin-stdlib-1.6.21.jar" 这样的,所以兼容高版本的依赖,不重复下载

  1. runtime-libraries:
  2.   libraries-folder: '@Server:libraries'  # 存放依赖的位置
  3.   libraries:
  4.     kotlin-stdlib: #随便写,不冲突就行
  5.       repository: https://maven.aliyun.com/repository/public   #仓库地址,可选,默认maven
  6.       groupId: org.jetbrains.kotlin
  7.       artifactId: kotlin-stdlib
  8.       version: 1.6.21
复制代码
如果你复制我的例子报错,请把中文去掉

其他方法请看原帖 https://github.com/Revxrsal/PluginLib#readme
注意这个魔改的版本没有relocate功能

如果你想用于其他地方请把 YamlConfiguration 替换成别的Yaml解析器


评分

参与人数 2人气 +3收起 理由
不好,快跑!+ 2高呼666!
Teaftc+ 1MCBBS有你更精彩~

查看全部评分

帖子永久链接: 

Minecraft中文论坛 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖若有内容转载自其它媒体,不代表本站赞同其观点和对其真实性负责
6、若本帖涉及任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意
7、Minecraft(我的世界)中文论坛管理员和版主有权不事先通知发贴者而删除本文

Teaftc 当前离线
积分
2122
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2016-5-23
查看详细资料

来自:香港

沙发
发表于 2022-6-10 09:41:35 | 只看该作者
感谢大佬分享
回复

使用道具 举报

逝幕 当前离线
积分
2149
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-1-20
查看详细资料

来自:山东

板凳
发表于 2022-6-11 10:31:11 | 只看该作者
膜拜大佬
回复

使用道具 举报

teddyxlandlee 当前离线
积分
5022
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-7-13
查看详细资料

来自:北京

地板
发表于 2022-6-11 18:28:29 | 只看该作者
你这unsafe,够干净吗,不知能否直接扬了旧的classloader套个壳
参考:vanilla客户端(1.18+)的net.minecraft.bundler.Bundler

回复

使用道具 举报

结冰的离季 当前离线
积分
4304
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-1-27
查看详细资料

来自:广东

5#
 楼主| 发表于 2022-6-11 19:07:02 | 只看该作者
teddyxlandlee 发表于 2022-6-11 18:28
你这unsafe,够干净吗,不知能否直接扬了旧的classloader套个壳
参考:vanilla客户端(1.18+)的net.minecr ...

其实我试过,但是扬classloader 只能应用于用这个classloader新加载的类,插件主类的classloader依旧不变,就算我替换了插件主类的classloader,对于kotlin-stdlib这类语言环境来说单单替换主类classloader无效,于是我参考了taboolib的实现采用的unsafe
回复

使用道具 举报

teddyxlandlee 当前离线
积分
5022
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-7-13
查看详细资料

来自:北京

6#
发表于 2022-6-11 19:59:31 | 只看该作者
本帖最后由 teddyxlandlee 于 2022-6-11 20:03 编辑
对于kotlin-stdlib这类语言环境来说单单替换主类classloader无效

看吧,说出你的需求了。
去用shadow插件(Gradle)或者相应的Maven插件啊,把kotlin-stdlib给它扬到如com.example.exampleplugin.lib.kotlin的包,或许是一个方案。
我对插件这行不太熟悉,插件一定要追求本体的小体积吗?如果需要,那么不妨在你的JavaPlugin套个壳,用新的classloader调用你使用kotlin/其他lib的类。
再强调一遍:能relocate(重定向包)就relocate!宁可多占10MB内存也不要跟人家的lib冲突,不划算!
Edit: 既然是从maven上拽包,那不妨在初始化的时候现场relocate,用什么工具就见仁见智了,哪怕你用Proguard混淆一遍kotlin-stdlib然后导出混淆映射表,在build jar和运行的时候用,我也认(前提是把mapping公开,如果你开源)

回复

使用道具 举报

结冰的离季 当前离线
积分
4304
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-1-27
查看详细资料

来自:广东

7#
 楼主| 发表于 2022-6-11 21:15:05 | 只看该作者
本帖最后由 结冰的离季 于 2022-6-11 21:19 编辑
teddyxlandlee 发表于 2022-6-11 19:59
看吧,说出你的需求了。
去用shadow插件(Gradle)或者相应的Maven插件啊,把kotlin-stdlib给它扬到如com. ...

shadowjar relocate kotlin 的库会出问题,不然我早relocate了,这个是推动我动态下载的原因。maven我没用过。只要把依赖按各个版本、包名分目录放好基本不会出现冲突的问题

回复

使用道具 举报

teddyxlandlee 当前离线
积分
5022
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-7-13
查看详细资料

来自:北京

8#
发表于 2022-6-12 10:36:57 | 只看该作者
结冰的离季 发表于 2022-6-11 21:15
shadowjar relocate kotlin 的库会出问题,不然我早relocate了,这个是推动我动态下载的原因。maven我没用 ...

去alexsocha的luckyblock看看,TA为了防止撞库冲突(实际上是我issue的),把kotlin给relocate了,少说也稳定运行了1年
回复

使用道具 举报

结冰的离季 当前离线
积分
4304
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-1-27
查看详细资料

来自:广东

9#
 楼主| 发表于 2022-6-12 15:10:46 | 只看该作者
本帖最后由 结冰的离季 于 2022-6-12 15:36 编辑
teddyxlandlee 发表于 2022-6-12 10:36
去alexsocha的luckyblock看看,TA为了防止撞库冲突(实际上是我issue的),把kotlin给relocate了,少说也 ...

mod和插件的加载方式是有区别的,relocate的方式如果正常关闭服务器再启动那没事,但是热重载就识别不到,我也不知道是什么原因,就kotlin的库这样,有时候正常重启也加载不到
据我所知基本上所有高版本的kotlin开发的插件都是动态加载依赖或者打包到前置里(也没relocate),这是有道理的,不然spigot也不会提供这个api
比如 taboolib系列 eco系列 nova

这就说明这不单单是我遇到的问题
各有各的好处,但我选择动态加载





回复

使用道具 举报

DreamVoid 当前离线
积分
10177
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-1-30
查看详细资料

来自:福建

10#
发表于 2022-6-25 23:05:08 | 只看该作者
本帖最后由 DreamVoid 于 2022-6-25 23:07 编辑

还是很轻量的,可惜我已经把lucko的代码抠下来内嵌到我的插件里了
不过我怎么没看到sun.misc.Unsafe原来是魔改版,那没事了
回复

使用道具 举报

结冰的离季 当前离线
积分
4304
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-1-27
查看详细资料

来自:广东

11#
 楼主| 发表于 2022-6-26 18:20:45 | 只看该作者
DreamVoid 发表于 2022-6-25 23:05
还是很轻量的,可惜我已经把lucko的代码抠下来内嵌到我的插件里了
不过我怎么没看到sun.misc.Unsafe ...

java17 找不到别的方法来调用classloader的addurl 方法,只能unsafe了
回复

使用道具 举报

wyx168282401 当前离线
积分
108
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2014-6-12
查看详细资料

来自:山东

12#
发表于 2022-6-27 15:01:20 | 只看该作者
太有用了!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2023-4-17 10:31 , Processed in 0.062014 second(s), Total 28, Slave 27 queries, Release: Build.2023.03.15 0137, Gzip On, Redis On.

"Minecraft"以及"我的世界"为美国微软公司的商标 本站与微软公司没有从属关系

© 2010-2022 我的世界中文论坛 版权所有 本站内原创内容版权属于其原创作者,除作者或版规特别声明外未经许可不得转载