Учитывая регулярный проект градиента java, у нас есть некоторый основной метод ввода, который определяется в манифесте jar и связке зависимостей.Создание компактной банки без зависимостей
Теперь, как правило, когда мы создаем распределение мы можем использовать плагин приложений и иметь определенную структуру, как это как выход
/bin (some splatform specific scripts that point to our jar)
/lib (our jar + all dependencies with their dependencies etc...)
Проблема заключается в том, что даже если бы мы использовали только несколько классов от наших прямых зависимостей, они и все транзитивные зависимости окажутся в распределении. Например, из 100M распределения только 1M на самом деле является кодом, который может работать и может иметь какое-либо отношение к нашему приложению ...
Инструмент, такой как proguard, может сжимать код в конкретной банке с различными оптимизациями, но все равно, код не используется. По неиспользованным я имею в виду, что основным методом является точка входа в банку, и в зависимости от основного кода он никогда не сможет использовать большую часть кода в фактической прикладной банке и многое другое в библиотечных баночках ...
Наша цель - создать эту банку 1M, которая имеет только код, который она фактически будет использовать, принимая во внимание, что является основным методом в манифесте ...
Я искал много, но не смог найти решение к этому, proguard был очень близок, но я не могу найти никакого способа сделать его только заботой о конкретном потоке кода не ко всем.
Есть ли инструменты, которые могут это сделать?
Только примечание стороны: имейте в виду, что есть a) отражение ... очень сложно определить, какие классы действительно необходимы, а затем b) проблему остановки, которая переводит: для произвольных программ и ввод, вы можете ** не ** определить, используется ли какая-либо функция (aka class) или нет. Итак, что я говорю: может быть, есть прагматические ответы на вашу проблему, но большая теория против вас. – GhostCat
Отключить тему для SO. – ManoDestra
@ Jägermeister обычно, если библиотека зависит от отражения, вы понимаете это и конкретно говорите proguard, чтобы не удалить тот или иной класс ... в моем случае я вообще не использую его ... относительно b), как это? если proguard уже делает это, он идет через байт-код, и если он обнаруживает мертвый код, он избавится от него или от каких-либо неиспользуемых классов ... поэтому proguard делает то, что я хочу, просто он не заботится о точке входа ... – vach