我有两个 jar 文件,一个是我的世界服务器 spigot.jar
,另一个是我自己的 jar (patch.jar
),其中包含几个小的自定义类。
patch.jar
中的类需要替换 spigot.jar
中的类,我已经阅读了大量“教程”和有关执行此操作的问题,但没有一个提供除了在启动脚本中使用类路径选项之外,甚至还有有关如何实际执行此操作的基本信息。
我已经尝试过:
- -
cp Spigot.jar
Patch.jar:针对补丁抛出错误“无主 list ”,因为它没有 Main()。 - -
cp Spigot.jar;
Patch.jar:输出 jvm 选项列表并关闭程序。 - -
jar Spigot.jar;
Patch.jar:找不到 jar Spigot.jar;Patch.jar(我知道,这是一个远景)
我在 Patch.jar
list 中创建了一个公共(public) void main()
和 Main-Class
,并且它运行了 main ()
正确,然后退出而不加载插口。如果我将顺序切换为首先加载插头,它会正常加载并且永远不会触及我的补丁。
有人知道如何执行此操作或类似的操作吗?
我的要求是,出于法律和技术原因,不得对龙头 jar 进行任何修改。我已经手动替换了 spigot.jar
副本中的类,以验证它们按预期工作,我的代码没有问题。
附注这不能成为插件的一部分,它是一个 mod 是有原因的,并且是支持一个非常大的插件的一部分,该插件在运行时更改数十个 NMS 类。这是为了修补一些在运行时无法通过反射修改的东西,或者只是以合理的方式更改变量类。
最佳答案
首先,如果您希望 Java 优先于原始类加载您的类,则 patch.jar 文件必须位于类路径中的原始 jar 文件之前。
并且您必须使用正确的命令行:
java -cp patch.jar;spigot.jar the.main.class.of.Spigot
要了解主类是什么,请打开 spigot.jar,然后检查其 list 文件:主类列在其中。
该文件还可以将其他 jar 文件列为依赖项。在这种情况下,您还必须将它们添加到类路径中。
关于java - 如何通过类路径用另一个 jar 修补一个 jar(替换类文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837653/