Декомпилировать и перекомпилировать один файл из jar

Эта проблема была решена с помощью комментариев:

Нужно было перекомпилировать java с правильной целевой версией. В моем случае javac -source 1.3 -target 1.3 вместо простого javac сделал свое дело.

Описание проблемы:

У меня есть скомпилированная .jar java-программа, в которой необходимо изменить одну строку URL-адреса. Используя JD, я смог декомпилировать код и внести изменения.

Поскольку я хотел бы избежать перекомпиляции всего проекта, я подумал, что могу просто перекомпилировать один файл .java, который я изменил, в .class и заменить им оригинал.

Однако после переупаковки jar программа запускается, но функциональные возможности, использующие код, который я изменил, ведут себя беспорядочно.

В логе нахожу:

E EventDispatchThreadExceptionHandler:Unhandled exception occurred during event dispatching.::
java.util.MissingResourceException: Can't find bundle for base name com.myCompany.mySoftware.resources.ModuleResources, locale en_US
       at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:842)

ModuleResources.java - это файл, который я изменил...

Анализ проблемы:

  1. Переупаковка не при чем: если извлекать и перепаковывать оригинальную банку, то все работает.
  2. Моя модификация также не кажется проблемой: когда я перекомпилирую JD-декомпилированный java-файл и использую полученный файл класса для переупаковки, я получаю тот же сбой.

Я декомпилировал переупакованный файл jar и сравнил его с декомпиляцией исходного файла jar: в файле, который я изменил (по крайней мере), код кажется идентичным, НО JD показывает разные номера строк. Может ли это намекнуть на проблему?

Любая помощь будет принята с благодарностью.

Большое спасибо!


person ARF    schedule 06.03.2012    source источник
comment
программа не запускается довольно расплывчато - пожалуйста, дайте больше информации.   -  person Jon Skeet    schedule 06.03.2012
comment
Для какой версии Java были скомпилированы классы в JAR? Какую версию Java вы используете для перекомпиляции класса? Какое сообщение об ошибке вы получаете?   -  person Perception    schedule 06.03.2012
comment
В общем, так и должно работать. Как сказал Джон, нам нужно больше информации о проблеме — вы видите исключения?   -  person Andreas Dolk    schedule 06.03.2012
comment
Хорошо, я вижу, что описание проблемы было слишком расплывчатым. Пожалуйста, смотрите измененный вопрос. Я не уверен, для какой версии java были скомпилированы классы. Как я могу узнать?   -  person ARF    schedule 06.03.2012
comment
Из того, что я вижу, версия Java, установленная на рассматриваемом устройстве, - это cvm 1.3. Я перекомпилировал файл .java с текущим JDK (Java SE 7). Может ли это быть проблемой?   -  person ARF    schedule 06.03.2012
comment
@Восприятие Большое спасибо. Ты наставил меня на правильный путь! После компиляции с javac -source 1.3 -target 1.3 теперь все работает.   -  person ARF    schedule 06.03.2012
comment
@Perception Не могли бы вы написать ответ, чтобы ОП принял его?   -  person fglez    schedule 07.03.2013


Ответы (2)


когда я перекомпилирую файл Java, декомпилированный JD, и использую полученный файл класса для переупаковки, я получаю тот же сбой

Кажется, это указывает пальцем на JD. Когда вы перекомпилируете JD-декомпилированный java-файл, можете ли вы сравнить результат с исходным файлом .class (например, разобрав оба и сравнив результат)? Если они различаются по существу, это придаст правдоподобности теории о том, что JD виноват; если нет, то проблема в другом.

person NPE    schedule 06.03.2012
comment
Как я сказал в вопросе, дизассемблированный код обоих идентичен по существу, за исключением номеров строк, которые показывает JD. - person ARF; 06.03.2012
comment
@ArikRaffaelFunke: В вашем вопросе даже не упоминается слово «разобрать». Вы говорите о декомпиляции, а я говорю о дизассемблировании. Последний гораздо более точен в том, что касается обнаружения различий в байт-кодах. - person NPE; 06.03.2012
comment
Извините за недопонимание. Я читал дизассемблирование, но понял декомпиляцию. Моя проблема решена, но для дальнейшего использования, как дизассемблировать байт-код? - person ARF; 06.03.2012
comment
@ArikRaffaelFunke: javap -c - person NPE; 06.03.2012
comment
Я использую этот здесь java.decompiler.free.fr - похоже, он правильно декомпилируется. Проблема в том, чтобы собрать его снова - person ControlAltDelete; 17.09.2012

Это старый вопрос.

В настоящее время я нашел хороший способ декомпилировать и переупаковать файл jar.

Вот хороший документ.

https://www.talksinfo.com/how-to-edit-class-file-from-a-jar/

Я рекомендую третий метод в документе.!!!

person Star_Man    schedule 04.07.2019