重命名预编译类文件(Java)上的导入
什么问题? 我是一名Minecraft服务器管理员/服务器主机/插件开发人员,但我发现在每一个新版本的核心游戏中都必须更新自己的个人插件,这绝对是一件麻烦事。它并不总是这样的,我有插件在20个版本中工作,而在过去没有中断。你可以想象,在我的生活中,每个月都要坐在一旁更新40个插件是一件不必要的烦恼,因为我以前从来没有这样做过 问题的原因是什么? 在每个新版本中,它们都要求您在编译的jar文件中使用不同的导入,从而强制破坏任何过时(但可能仍在工作)的jar文件。相信我。我可以阅读一个错误日志,知道什么时候我真的需要出去下载一个新的更新。我现在不需要保护自己。这只是一个游戏,我没有太多的把握 那我想怎么办呢? 为此,我想做一个简单的程序,自动更新我的所有插件。(插件以打包的.jar文件的形式出现。)它需要执行以下操作:重命名预编译类文件(Java)上的导入,java,class,minecraft,bytecode-manipulation,import,Java,Class,Minecraft,Bytecode Manipulation,Import,什么问题? 我是一名Minecraft服务器管理员/服务器主机/插件开发人员,但我发现在每一个新版本的核心游戏中都必须更新自己的个人插件,这绝对是一件麻烦事。它并不总是这样的,我有插件在20个版本中工作,而在过去没有中断。你可以想象,在我的生活中,每个月都要坐在一旁更新40个插件是一件不必要的烦恼,因为我以前从来没有这样做过 问题的原因是什么? 在每个新版本中,它们都要求您在编译的jar文件中使用不同的导入,从而强制破坏任何过时(但可能仍在工作)的jar文件。相信我。我可以阅读一个错误日志,知道
- 构建工具(例如Ant或Maven),允许您从源代码重新构建,并将代码加载到IDE中,以及
- 如何使用流编辑器(如sed或awk)更新源代码,或使用宏预处理器(如cpp或m4)生成源代码
1
标识。接下来的两个字节是字符串的字节长度,其余的字节是UTF-8(几乎)。与UTF-8不同,更高的平面存储为代理项对(6字节而不是4字节),代码点0存储为非规范化
类引用只是指向常量池的指针,指向类的完全限定名。完全限定名以正斜杠而不是点存储,以分隔完全限定名(java/lang/Object
)。它被标记为7型
常量池中的其他条目:类型3、4、9-12为四字节,类型7和8为两字节。类型5和6是8字节的,但它们也占用常量池中的两个插槽
类文件的其余部分似乎并不介意常量池的字节长度是否更改。在常量池的末尾添加条目似乎也是安全的(请确保更新常量池长度)
4) 因为jar文件只是一个zip文件,所以您只需要用更新的内容重新打包原始文件。我不认为这是可能的,所以你可能需要一些文件洗牌。查看实现。不确定,但您可以使用BCEL或ASM来完成此任务……您是否考虑过使用Maven来自动化构建过程?我建议编辑源代码并重新编译,而不是编辑编译后的类文件。@JanDvorak我可以用我自己的个人插件来实现这一点,但是一些是由老开发者制作的,他们已经停止了游戏的升级。我可以反编译他们的插件,将它们加载到IDE中并手动更新它们,但我更希望有一个更全局的解决方案,你知道吗?此外,这是一个学习Java新技能的好机会。@Pangamma那么,你没有想要升级的所有插件的源代码吗?编辑
class
文件可能是一种冒险。它们有很好的文档记录,但是二进制是二进制的。好的,我现在在第3步。这是到目前为止我的代码。我是否需要使用您发布的指南直接编辑二进制文件,还是应该将其转换为不太混乱的字符串,进行更改,然后将其转换回混乱的格式?(混沌意味着到处都是疯狂字符的二进制形式。)在我的测试输出中,我