Найти текст в декомпилированных файлах jar с помощью Jetbrains IDES

Я с Jetbrains IntelliJ (или Android Studio, если хотите), и мой проект построен с помощью gradle и некоторых внешних java-библиотек из пространства имен моей компании. Дело в том, что трудно перемещаться по классам, поскольку я не могу искать текст в файлах .jar или разрешать использование.

Есть ли у вас какие-либо идеи, как это сделать?, есть плагин или что-то еще? трюк может быть?

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

Ответ 1

IntelliJ IDEA (по состоянию на 2017.2 или новее) знает, как декомпилировать файлы JAR без подключения источника, то есть когда вы находитесь в режиме отладки и переходите к реализации. Однако это не позволит вам полностью искать текст (например, искать способы использования).

Если вам всего лишь 1-2 JAR, которые вам нужны для просмотра, вы можете вручную отредактировать свои свойства модуля в IntelliJ и добавить исходные JAR файлы (которые необходимо загрузить со своего веб-сайта библиотеки вместе с двоичными JAR файлами).

Другой вариант - использовать Maven и загрузить его вместе с двоичными файлами из общедоступного репозитория Maven (если мы говорим об открытых библиотеках).

Еще один вариант: на корпоративном уровне кто-то обычно устанавливает Artifactory (например https://www.jfrog.com/artifactory/), который является источником для всех библиотеки и их исходный код.

Если вы используете обновленную сборку script (например, Gradle), вы можете создать проект IntelliJ со всеми источниками, уже связанными.

Надеюсь, это поможет!

Ответ 2

Нет простого способа сделать это. Единственный способ поиска чего-либо в библиотечном коде - это подключить источник. Прикрепленный источник может быть кодом, который вы декомпилировали самостоятельно, но IDE не сделает это за вас (но я думаю, что кто-то может написать плагин, который декомпилирует всю библиотеку и прикрепляет декомпилированный источник). Поэтому я предполагаю, что это может быть "трюк", который вам нужно сделать.

Почему это невозможно? Я не писал IDE, поэтому я не могу быть уверен, почему. Но, скорее всего, проблема с поиском текста в файлах jar без прикрепленного источника заключается в том, что текстовое представление зависит от декомпилятора. Нет никакого "лучшего" способа декомпилировать данный класс. Иногда декомпиляция может быть даже невозможна (например, байт-код с множеством инструкций перехода/условного перехода, которые плохо переходят в контурные/условные конструкции). В таких случаях декомпиляторы могут делать что угодно: отбрасывать исключение, помещая исходный байт-код, просто помещать операторы goto в код Java, чтобы хотя бы показать, что делает код.

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

В то время как вышеприведенный аргумент не применяется при поиске методов/полей, он по-прежнему не разрешен, скорее всего, потому что IDE анализирует исходный код для поиска использования вместо анализа байт-кода (скомпилированный код).