2017-02-21 4 views
0

Это вытекает из этого вопроса: Gradle, Tika - Exclude some dependency packages making a "fat jar" too fatИспользуйте Gradle добро, чтобы как-то извлечь и перестроить банки с зависимостями?

Ответ, который я выбрал там действительно сказать вам, как сократить размер «жир банки» (то есть исполняемую банка, который содержит всю его зависимость в нем), предусматривая какие зависимости исключать.

Используя эту технику, я разрезал свою банку с 62 МБ до 26 МБ. Но, извлекая эту банку и исследуя объемы составных каталогов (используя отличное приложение под названием TreeSize), я обнаружил, что мои классы составляют всего 228 КБ. Остальные - зависимости.

Допустимо, мой проект (или его зависимости) использует некоторые мощные технологии: в частности, Lucene (10 МБ), Apache POI (10,5 МБ), openxmlformats (10 МБ) и т. Д. (Предварительно сжатые размеры, конечно).

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

Учитывая, что автономная «жирная баня» не предназначена для универсальности, поэтому ее не нужно переполнять материалом, который она не использует, и учитывая, что Gradle очень умный и предназначен для тяжелого подъема для автоматизации здания, возможно, не должно/не должно быть какого-то способа извлечения и упаковки ТОЛЬКО тех классов, которые действительно необходимы: в частности, взламывая банки пакета, а затем переупаковывая только нужные классы?

26 МБ не является огромным размером для толстой банки. Но чем больше «технологий» использует индивидуальный проект, тем больше он станет использовать только крупнозернистый метод исключения банок зависимости.

PS Я знаю, что это было бы далекой от тривиальной задачи!

+0

Я считаю, что введение на ваш вопрос не требуется. Вероятно, вам следует начать с публикации конфигурации shadowJar и спросить, как удалить из нее определенные файлы. Большинство людей не хотели бы смотреть на другой вопрос, чтобы получить контекст. (Я знаю это, так как я ответил на это :)) – sm4

ответ

3

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

apply plugin: 'java' 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

dependecies { 
your dependencies 
} 

jar { 
    archiveName = 'Name.jar' 

    manifest { 
     attributes 'Main-Class': 'uk.co.cdl.Main', 
       'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '), 
       'Implementation-Version': project.version 
    } 

    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) { 
     exclude 'what you want to get rid dependencies/directories/files' etc 
    } 
} 

С помощью этого решения, расширяя задачу jar, ваша конструкция градиента создаст исполняемую банку с библиотеками в конфигурации компиляции, необходимой для запуска.

PS.Если вы получаете грузы транзитных зависимостей от своих зависимостей, попробуйте исключить их с помощью

compile (artifactGrp:artifactId:version) {transitive=false} 

PS2. Существует плагин netflix, который, как я полагаю, может сканировать ваши сценарии градиента, проверка неиспользуемых зависимостей https://github.com/nebula-plugins/gradle-lint-plugin

PS3. Существует плагин, который может сканировать уязвимости используемых зависимостей и т. Д. https://jeremylong.github.io/DependencyCheck/dependency-check-gradle/

+0

Большое спасибо. Это немного над головой (как я думал, любое решение может быть) с моим нынешним пониманием Gradle. Но это также потенциально фантастично, хороший стимул для меня забрать большую толстую книгу на Gradle, а другую на Groovy и начать учиться. –

+0

@mikerodent Добро пожаловать. Еще одна замечательная вещь, которую вы могли бы изучить, - это переместить ответы вниз, чтобы помочь людям получить свои привилегии при переполнении стека, так как требуется попытка написать ответ, пожалуйста, уважайте это. http://stackoverflow.com/help/someone-answers – LazerBanana

+0

Эм ... Я действительно об этом знаю и ответил несколько раз сам! Лично я не обязательно ожидаю, что люди смогут быстро и быстро принять решение ... –

1

Возможно, имеется плагин Gradle, который выполняет какой-либо анализ используемых и неиспользуемых классов, но сам Gradle не обладает такой возможностью. Он просто собирает зависимости, которые вы объявили по мере необходимости, и добавляет переходные. Плагин ShadowJar просто распаковывает их и упаковывает в одну банку.

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

Чтобы сделать это вручную, you can filter the contents of the shadowJar:

shadowJar { 
    exclude 'classes-you-dont-want.class' 
} 

непроверенным, но плагин выглядит достаточно прочным, и, вероятно, позволит вам делать такие вещи, как:

shadowJar { 
    exclude '**/*bad.class' 
} 
+0

Спасибо, это полезно, но на самом деле не отвечает на вопрос. Я не прошу вручную удалить отдельные классы. Кстати, я не знаю, говоришь ли ты, что отдельные классы (и пакеты?) Можно удалить из банок зависимости, используя эту технику ... или просто классы ** в текущем проекте **. В любом случае, я хочу, чтобы Gradle делал это *** автоматически ***: чтобы определить, какие классы/пакеты в баночках зависимостей используются, и включать только те, которые содержатся в жировой банке. –

+0

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

+0

'Это следует из этого вопроса: Gradle, Tika. Исключите некоторые пакеты зависимостей, делая «жирную банку» слишком толстой »- вы должны заменить это введение конфигурацией shadowJar. Частные вопросы имеют более высокий шанс получить ответ. – sm4

Смежные вопросы