Выборочное включение зависимостей в JAR

У меня есть библиотека, которую я написал на Scala, которая использует Bouncy Castle и имеет целую кучу зависимостей. Когда я сворачиваю банку, я могу либо свернуть "толстую" банку с всеми зависимостями (включая scala), которая весит около 19 МБ, либо я могу свернуть тощую банку, которая не не имеет зависимостей, но занимает всего несколько сотен КБ.

Проблема в том, что мне нужно включить классы/jar Bouncy Castle в мою библиотеку, потому что, если их нет в пути к классам во время выполнения, возникают всевозможные исключения.

Итак, я думаю, что идеальной ситуацией будет, если есть какой-то способ заставить Maven или SBT включать некоторые, но не все зависимости в свернутом банке. Некоторые зависимости необходимы во время компиляции, но нет во время выполнения, например, стандартные библиотеки Scala. Есть ли способ заставить это произойти?

Спасибо!


person Alex    schedule 09.09.2011    source источник


Ответы (4)


Я бы попробовал плагин sbt proguard из https://github.com/nuttycom/sbt-proguard-plugin . Он должен иметь возможность отсеивать классы, которые не используются.

person thoredge    schedule 09.09.2011
comment
+1 proguard выглядит очень красиво по сравнению с assembly xml-hell. - person 4e6; 10.09.2011
comment
Самое главное, это уменьшит размер библиотек, а не их количество; библиотека scala сама по себе больше 8 мегабайт - person thoredge; 10.09.2011
comment
Есть ли способ сказать pro guard просто не включать scala-libs? - person Alex; 11.09.2011
comment
Не уверен, что вы собираетесь. Если вы написали scala-приложение, вам понадобятся хотя бы некоторые части scala-libs. - person thoredge; 11.09.2011

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

Вот хорошая документация по этому тема (раздел 8.5.4), здесь находится официальная документация.

Обратите внимание, что вы можете включить все артефакты, принадлежащие к одной группе, используя нотацию с подстановочными знаками в наборах зависимостей, например hibernate:*:jar будет включать все файлы JAR, принадлежащие группе гибернации.

person Roland Ewald    schedule 09.09.2011

Покрытие мавен...

Поскольку вы объявляете, что ваш проект зависит от надувного замка в вашем maven pom, любой, кто использует maven для зависимости от вашей библиотеки, по умолчанию будет использовать надувной замок как транзитивную зависимость.

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

Вопрос о том, будут ли зависимости вашей библиотеки упакованы в зависимые проекты при их сборке, зависит от того, как эти проекты настроены, и установка областей повлияет на поведение по умолчанию.

Например, упаковка типа jar по умолчанию не включает зависимости, тогда как война будет включать те, которые находятся в области компиляции (но не тестируются или не предоставляются). Цель дизайна здесь заключалась в том, чтобы плагины упаковки вели себя наиболее часто требуемым образом без необходимости настройки, но, конечно, плагины упаковки в maven можно настроить для другого поведения, если это необходимо. Сами плагины, которые занимаются упаковкой, хорошо задокументированы на сайте apache maven.

Если пользователи вашей библиотеки вряд ли будут использовать maven для создания своих проектов, можно использовать плагин Shade, который позволит вам создать «uber-jar», содержащий все зависимости, которые вы хотите. Вы можете настроить определенные включения или исключения.

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

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

Для получения дополнительной информации о зависимостях и областях действия в maven см. справочное руководство, опубликованное Sonatype.

person Brian Smith    schedule 09.09.2011

Я не специалист по Scala, но я игрался с сборкой вещей в Java + Maven.

Вы пытались создать свой собственный дескриптор сборки для плагина сборки? https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

Вы можете скопировать/вставить дескриптор jar-with-dependencies, а затем просто добавить несколько исключений в свой ‹ dependencySet >. Я не эксперт по Maven, но вы должны быть в состоянии настроить его так, чтобы разные профили запускали разные сборки сборки.

EDIT: Ack, не видел, чтобы мой HTML был скрыт

person rpgFANATIC    schedule 09.09.2011