Декомпиляция файлов классов Java и сравнение с SVN - PullRequest
1 голос
/ 06 июня 2011

У нас есть обычные файлы Java, находящиеся в SVN. Мы внесли некоторые изменения в эти файлы, но бывает, что эти файлы потеряны (их нет в SVN). Но у нас есть файлы классов, которые создаются с использованием недавно измененных файлов.

Можем ли мы использовать файлы классов, декомпилировать их и сравнивать с SVN. Какой самый простой способ сделать это?

Есть около 400 измененных файлов. Так что сравнивать один за другим невозможно.

Я ищу любой инструмент или сценарий.

Также есть ли декомпилятор, который бы декомпилировал всю папку за один раз?

Спасибо

Ответы [ 6 ]

8 голосов
/ 06 июня 2011

Для декомпиляции используйте JAD , наиболее часто используемый инструмент. Сравнение немного сложнее, хотя. Я бы предложил следующий сценарий:

  1. Получить последний исходный код из SVN
  2. Построить
  3. Декомпилировать его (!)
  4. Возьмите ваши скомпилированные классы, которые содержат некоторые модификации, но у вас нет источников
  5. Декомпилируйте их также
  6. Сравнить оба каталога декомпилированных источников

Зачем компилировать и декомпилировать исходные коды? Поскольку JAD дает довольно хорошие результаты, но он никогда не будет генерировать точные те же источники, которые использовались. Поэтому, если вы хотите избежать головной боли при сравнении исходных и декомпилированных (и быстро определить фактические различия), вам нужно сравнить два вывода JAD, а не исходный и синтетический вывод JAD.

Я надеюсь, что сравнение двух структур каталогов не станет для вас проблемой. Вы можете использовать Total Commander в Windows или различные утилиты / скрипты в Linux, например:

$ diff -r dir1 dir2
2 голосов
/ 06 июня 2011

Я использовал приведенную ниже команду (jad decompiler) для компиляции всех файлов классов в папке за один раз.

             jad -o -r -sjava -dsrc tree/**/*.class 
2 голосов
/ 06 июня 2011

jad может декомпилировать целую папку, но результат зависит от нескольких факторов. Во-первых, JAD хорошо поддерживает только Java 4. Java 5 и выше будет содержать нечетные куски байт-кода, которые JAD не понимал.

Если код скомпилирован с символами отладки, вы можете изменить номера строк (это может сделать плагин jadclipse ), но сам JAD не может этого сделать.

Если вы скомпилировали код с -g:source, то файлы классов содержат полный исходный код. На первый взгляд, я не знаю, как это сделать, но такие инструменты, как javap (поставляется с JDK) или ASM , позволят вам получить его.

2 голосов
/ 06 июня 2011

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

1 голос
/ 06 июня 2011

Используйте jd-gui, очень хороший декомпилятор, но компилирование ... будет болезненным.

0 голосов
/ 07 марта 2012

Сейчас я делаю именно это, используя http://java.decompiler.free.fr/ для декомпиляции и последующего сравнения (http://www.scootersoftware.com/) для сравнения пакетов и файлов. Похоже, это отличная идея для быстрого сравнения с реальной версией(svn) скомпилировано и декомпилировано, чтобы проверить, какие файлы (и какие разделы) актуальны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...