如何通过类路径修补jar与另一个jar(替换classfiles)

时间:2015-11-20 23:17:05

标签: java classpath patch minecraft bukkit

我有两个jar文件,一个是minecraft服务器spigot.jar,另一个是我自己的jar(patch.jar),里面有几个小的自定义类。

patch.jar中的类需要替换spigot.jar中的类,我已阅读了许多关于这样做的“教程”和问题,但它们都没有提供有关如何实际执行此操作的基本信息,除了在启动脚本中使用classpath选项。

我试过了:

  • - cp Spigot.jar Patch.jar:为补丁抛出错误“无主要清单”,因为它没有Main()。
  • - cp Spigot.jar; Patch.jar:输出jvm -options列表并关闭程序。
  • - jar Spigot.jar; Patch.jar:找不到jar Spigot.jar; Patch.jar(我知道,这是一个很长的镜头)

我在void main()清单中公开了Main-ClassPatch.jar,它正确地运行了main(),然后退出而没有加载套管。如果我首先将订单切换到加载套管,它会正常加载并且永远不会触及我的补丁。

有谁知道如何做到这一点,或类似的东西? 我的要求是,由于法律和技术原因,没有对插口罐进行修改。我已经手动替换了spigot.jar副本中的类,以验证它们是否按预期工作,我的代码没有问题。

P.S。这不能成为插件的一部分,它是一个mod的原因,并且是支持一个非常大的插件的一部分,该插件在运行时更改了许多NMS类。这是为了修补一些在运行时无法通过反射修改或只是以合理的方式更改变量类的东西。

1 个答案:

答案 0 :(得分:2)

首先,如果您希望Java优先于原始类加载类,则patch.jar文件必须在类路径中的原始jar文件之前

您必须使用正确的命令行:

java -cp patch.jar;spigot.jar the.main.class.of.Spigot

要知道主类是什么,打开spigot.jar,anc检查它的清单文件:主类列在其中。

该文件也可以将其他jar文件列为依赖项。在这种情况下,您还必须将它们添加到类路径中。