Как исправить банку другой банкой через путь к классам (заменяя файлы классов)

У меня есть два 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-Class в Patch.jar манифесте, и он правильно выполнил main(), а затем завершил работу без загрузки патрубка. Если я изменил порядок загрузки втулки первым, он загрузится нормально и никогда не коснется моего патча.

Кто-нибудь знает, как это сделать, или что-то подобное? Мое требование состоит в том, что НИКАКИХ МОДИФИКАЦИЙ в патрубок сливного крана не вносятся по юридическим и техническим причинам. Я уже вручную заменил классы внутри копии spigot.jar, чтобы убедиться, что они работают должным образом, с моим кодом проблем нет.

P.S. Это нельзя сделать частью плагина, это мод по какой-то причине, и он является частью поддержки очень большого плагина, который изменяет десятки классов NMS во время выполнения. Это сделано для исправления некоторых вещей, которые нельзя изменить во время выполнения с помощью отражения, или просто для рационального изменения классов переменных.


person confused penguin    schedule 20.11.2015    source источник


Ответы (1)


Во-первых, если вы хотите, чтобы Java загружала ваши классы вместо исходных, файл patch.jar должен располагаться перед исходным файлом jar в пути к классам.

И вы должны использовать правильную командную строку:

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

Чтобы узнать, что такое основной класс, откройте spigot.jar и проверьте его файл манифеста: в нем указан основной класс.

Также возможно, что в файле будут указаны другие файлы jar в качестве зависимостей. В этом случае вам также придется добавить их в путь к классам.

person JB Nizet    schedule 20.11.2015
comment
Спасибо. Это работает отлично, с несколькими незначительными ошибками, я уверен, что смогу разобраться. Если бы только ответы, эти простые ответы существовали повсюду, вместо того, чтобы вы не хотели этого делать, потому что это так (вставьте все, что применимо: не ООП / может сломаться / я сам этого не понимаю / это требует усилий / менее сложно, чем наиболее сложное возможное решение) . - person confused penguin; 21.11.2015
comment
@confusedpenguin Ха-ха, как насчет того, что вы не хотите этого делать, потому что вы столкнетесь с кошмаром циклических зависимостей и дополнительной сложности около 10 месяцев в будущем, но вы, вероятно, не поверите мне прямо сейчас. - person Jason C; 19.09.2016