IntelliJ IDEA - Декомпиляция / Редактирование / Перекомпиляция JAR - PullRequest
0 голосов
/ 11 января 2019

Я понимаю, что это может показаться совершенно глупым вопросом, и этот вопрос представляет собой «стену текста», но я чувствую, что здесь я вышел из глубины и нуждаюсь в некотором руководстве. Я прочитал несколько ТАК вопросов по этой теме, но все еще не могу найти тот, который решает эту конкретную ситуацию. ( просьба ссылаться на обновления в конце этого поста )


ФОН

У нашей компании есть приложение, которое было построено на Java и выпущено в виде исполняемого пакета JAR разработчиком, который скончался пару лет назад. С тех пор была минимальная необходимость даже смотреть на этот код, не говоря уже о внесении каких-либо изменений. Это было действительно хорошо, потому что я занимаюсь программированием на VB.NET (Visual Studio), и, хотя я могу читать и разбираться в Java-коде, я не очень хорошо умею писать / отлаживать этот код.

Однако возникла недавняя проблема, которая вынудила меня попытаться взглянуть на этот Java-код из-за некоторых внутренних изменений в организации и структуре данных. Я заглянул в его каталог "src\" и нашел более старые версии его исходного кода, но нигде не смог найти самую последнюю версию. Я нашел некоторый код, который позволил мне извлечь JAR, который в настоящее время используется, в локальный каталог на CodeProject ( JarsVB ), поэтому я смог просмотреть некоторые из файлов .java при попытке выяснить, какой запрос используется для какой-то случайной операции. Я не знаю, какой инструмент (ы) использовал первоначальный разработчик для создания проекта / JAR, поэтому я установил IntelliJ IDEA Community Edition 2018 в качестве IDE, и до сих пор он работал для меня, чтобы просто просмотрите код, чтобы я мог немного понять, что он делает.


ПРОБЛЕМА / ЦЕЛИ

К сожалению, теперь мне необходимо внести изменения в код Java и обновить JAR, и именно здесь я не могу понять, что мне нужно делать. У меня есть локальная копия кода из «разархивированного» JAR, содержащего все файлы .java и .class (вместе со всеми остальными ресурсами), но я не уверен, как перейти от этого к изменению кода и перекомпиляция исполняемого файла JAR.

Итак, мои цели здесь следующие:

  1. (правильно) Декомпилируйте существующий исполняемый файл JAR. ( Если упомянутое выше решение JarsVB сделало то, что должно было сделать, я должен уже обработать эту часть, но если есть лучший, более «интегрированный» способ сделать это, я я тоже буду к этому открыт. )
  2. Изменить один или несколько .java файлов. ( Я полагаю, что смогу понять синтаксис достаточно хорошо, чтобы выполнить эту часть. )
  3. Отладка / проверка моих изменений.
  4. Перекомпилируйте изменения в обновленный исполняемый файл JAR для выпуска. ( ЭТО - вот где я испытываю наибольшее замешательство. )

ЧТО Я СДЕЛАЛ

Я искал документацию для IntelliJ, чтобы попытаться выяснить, как сделать все это возможным, но я чувствую, что мне чего-то не хватает. Я установил настройки «Структура проекта» так, чтобы они указывали на определенную папку, но, похоже, я не могу заставить ее что-либо создать по моему указанному пути.

image Project Settings -> Project">

image Project Settings -> Modules">

Я вошел в один из .java файлов и сделал / сохранил небольшое изменение для тестирования, затем перешел в меню Build и перепробовал все доступные мне варианты сборки: "Build Project", «Модуль сборки» и «Проект перестройки». Каждый раз журнал событий показывает, что «Все файлы обновлены» (хотя я и изменил один), поэтому я захожу в выходной каталог, чтобы посмотреть, что он построил, но папка пуста.

Я посмотрел документацию IntelliJ для Упаковка модуля в файл JAR , в котором говорится

В главном меню выберите Build | Артефакт сборки

Но эта опция отключена в моем меню Build , и когда я смотрю в диалоговом окне Структура проекта , раздел Артефакты пуст, поэтому я пытаюсь добавить новый параметр ( Добавить -> JAR -> Из модулей с зависимостями ... ), но я не уверен, как правильно установить этот параметр либо вверх.

image JAR -> From modules with dependencies...">

Я попытался выбрать Main Class из моего каталога classes/, но на самом деле он не принял ни один из выбранных файлов .class, поэтому я просто оставил его пустым. Затем я выполнил поиск файла MANIFEST, но нигде не смог его найти, поэтому оставил этот пробел также. Параметр меню Build теперь включен, но когда я попытался Build Artifact , снова, я ничего не получил в моей выходной директории. Фактически, единственные файлы, которые я могу найти, которые были изменены, находятся в моем локальном рабочем каталоге. Я просто ошеломлен в этот момент.


ЗАКЛЮЧИТЕЛЬНЫЕ МЫСЛИ / ВОПРОСЫ

Я попытался представить здесь как можно больше деталей обо всех вещах, которые я пробовал и прошел, чтобы обновить этот JAR-файл, но если есть вопросы по поводу чего-либо, пожалуйста, дайте мне знать. Я не ищу «раздаточный материал» и не ожидаю, что кто-то сделает это за меня, но я также не хочу становиться Java-разработчиком только ради внесения небольших изменений в приложение, которое в конечном итоге приведет к быть заменены приложением .NET. Я просто недостаточно знаком с инструментами или разработкой Java в целом, чтобы знать, как добраться туда, где я хочу быть, откуда я.

Мои декомпилированные исходные файлы находятся в совершенно отдельном каталоге от исходного производственного файла JAR, потому что, когда я перекомпилирую это время, я хочу полностью воссоздать JAR. Правильно ли я понимаю процесс разработки Java при редактировании одного из .java файлов, полученных после декомпиляции с помощью JarsVB и последующей перекомпиляции JAR?

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


EDIT / UPDATE

Итак, глядя на ссылку в принятом ответе в другом SO-вопросе, Как правильно собрать jar-файлы из IntelliJ? , я выяснил хотя бы одну часть своей проблемы: Оставив Main Установка класса в моей пустой конфигурации Artifacts была проблемой. Так как я не смог выбрать файл .class и не знал, как правильно заполнить это поле, я не дал IDE достаточно информации для правильной работы. Я ввел пространство имен и класс (namespace.class), который нашел в файле классов, который, очевидно, определяет метод main для приложения, затем установил путь к файлу MANIFISET.MF в моем выходном каталоге и снова попытался Артефакт сборки .

На этот раз, по крайней мере, DID создает JAR в моем заданном выходном каталоге, но его размер составляет всего 1 КБ. Как указано выше, исходные файлы находятся в совершенно отдельном каталоге от исходного файла JAR, из которого они были декомпилированы. Выходной каталог тоже полностью отделен от расположения исходного файла JAR. Нужна ли мне копия исходного JAR-файла в выходном пути для перекомпиляции для правильной работы?

Я делаю успехи, но я уверен, что на данный момент я упускаю из виду что-то «глупое», в первую очередь из-за моего незнакомства с IDE и разработки приложений Java в целом.

ОБНОВЛЕНИЕ 2

Глядя на другой вопрос SO - как создать jar-пакет java-пакета в идее intelliJ - я узнал, что мне нужно отдельно добавить необходимые файлы для переупаковки в JAR-файл. Однако возникает вопрос: какие файлы мне добавить? Связанный вопрос идентифицирует файлы .class, но когда я просматриваю файлы .class в моей рабочей директории, ни один из них не был обновлен в последнее время, так что похоже, что я все еще где-то пропускаю шаг.

Другой вопрос, который возникает в связи с этим, существуют ли определенные соглашения по разработке Java, о которых я должен знать при подготовке своей среды? Мой выходной путь настроен на совершенно отдельную папку, чем любой рабочий или производственный код, поэтому мне интересно, может ли что-то в этой установке вызвать проблемы.

Как я уже говорил, я внес небольшое изменение в один из файлов .java, затем попробовал оба варианта Build Module и Rebuild Project , но они все еще говорят мне, что "Все файлы обновлены". Тем не менее, я попытался добавить только файлы .class из моего каталога classes\ в мою конфигурацию Artifact и повторил попытку Build Artifact . Я получил немного больший файл (около 5 МБ), но когда я пытаюсь выполнить JAR, он просто ничего не делает, не говоря уже о том, чтобы действительно запустить приложение.

Я попытался еще раз, добавив корневую папку моей локальной копии исходного кода, добавив все, что содержит корневая папка. (да, каталог, вероятно, нуждается в "весенней уборке", но это на другой день)

All files/folders added to Artifact configuration

На этот раз я получил гораздо больший файл (примерно 21 МБ), поэтому я подумал, что мог бы решить проблему. К сожалению, нет такой удачи. JAR по-прежнему не выполняется.

Для справки, исходный файл JAR, из которого был декомпилирован код, составляет ок. 59 МБ, так что либо IntelliJ делает невероятную работу со сжатием, либо есть еще один шаг, который я еще не нашел. Я уверен, что все дело в том, чтобы правильно настроить мою IDE, но я просто не могу найти правильную комбинацию настроек.

...