Узнайте, какие классы Java на самом деле загружены и уменьшить JAR - PullRequest
0 голосов
/ 06 ноября 2018

Есть ли способ автоматически выяснить, какие классы Java действительно загружены (либо во время компиляции, насколько это возможно, либо во время выполнения приложения), и выбросить все другие классы из JAR для создания баночка меньшего размера? Имеет ли это смысл на практике?

Я говорю о классах приложений для приложения JAR. Обычно в приложении много библиотек, и приложению редко нужны все функции этих библиотек. Так что я подозреваю, что это значительно уменьшит размер заявки. Теоретически это может быть сделано, например, с помощью агента Java, который регистрирует, какие классы и ресурсы читаются одним или несколькими запусками приложения (или даже просто java -verbose: class), и плагином maven, который выбрасывает все другие классы. из баночки с зависимостями. Уже есть что-то подобное?

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

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Ну, плагин Maven Shade имеет опцию minimizeJar при создании Uber-JAR для вашего приложения:

https://maven.apache.org/plugins/maven-shade-plugin/

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

0 голосов
/ 06 ноября 2018

Глобальная стратегия.

1) Найти все классы, которые загружаются во время выполнения.

2) Список всех классов, доступных в пути к классам.

3) Сократите путь к классам, создав копии банок, содержащих только те классы, которые вам нужны.

Я сделал 1 и 2 часть, чтобы помочь вам.


1) Узнайте все загруженные классы. Вам нужно 100% покрытие кода (я говорю не о тестах, а о производстве). Запустите все возможные сценарии, чтобы все классы, в которых нуждается ваше приложение, были загружены и зарегистрированы.

Для регистрации загруженных классов попробуйте несколько подходов. Reflection , –verbose: флаг класса , также вы можете узнать об агенте java. Это позволяет модифицировать методы во время выполнения. Это пример кода java-агента или другого примера агента java

2) Чтобы найти все классы, доступные в jar, вы можете написать программу. Вам нужно знать все места, где находятся банки с приложениями. Зацикливайте эти банки (вы можете использовать ZipFile), просматривайте ZipFileEntry записей и собирайте все классы.

3) После этого напишите скрипт или программу, которая собирает ваше приложение. Например, теперь вы можете создать новый jar-файл для каждой библиотеки и поместить туда только необходимые классы.

Также вы можете использовать инструмент (опять же, вы программист, поэтому пишите программу), который проверяет код на зависимость от классов. Вы не хотите удалять классы, если они используются для компиляции. Когда я был студентом, я писал код alanyzer, который строит ориентированный граф для зависимостей классов.

Как отмечает @Gokul Nath KP, я делал это раньше. Я вручную изменяю зависимости gradle и maven, удаляя одну за другой, а затем полный регрессионный тест. Мне потребовалась неделя (наше приложение было небольшим по сравнению с современными мировыми корпоративными системами, созданными сотнями разработчиков).

Так что будьте креативны, и в случае успеха ваш проект будут использовать миллионы!

0 голосов
/ 06 ноября 2018

Это может быть плохим подходом для автоматизации, поскольку приложение может использовать отражение для инициализации объектов или один JAR зависит от другого JAR.

Единственный способ, который я могу придумать, - это удалить каждый JAR один за другим и проверить, работает ли приложение так, как ожидалось. С другой стороны, при таком подходе все модули приложения должны быть протестированы, поскольку один модуль может работать без определенной зависимости, а другой - нет.

Лучшее решение - позаботиться о развитии. Разработчик приложения должен быть осторожным при добавлении зависимости и удалении нежелательной зависимости после того, как его / ее фрагмент кода будет готов.

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