Ответ 1
Bundle-ClassPath
предназначен для включения зависимостей в нашем комплекте, так что наш пакет можно развернуть автономно.
Возьмем пример. Предположим, что код в моем пакете использует библиотеку, например. Google Guava. У меня есть два варианта упаковки моего пакета:
-
Просто создайте свой пакет с моим собственным кодом внутри него. Теперь в пакете будут инструкции
Import-Package
, объявляющие зависимость от Guava, и всем, кто хочет развернуть мой пакет в его приложении, также придется развернуть Guava. -
В качестве альтернативы я могу включить копию Guava внутри моего пакета и ссылаться на нее с моего
Bundle-ClassPath
. Тот, кто развертывает мой пакет, может развернуть только мой пакет, и вам не нужно беспокоиться о том, где взять Guava. Фактически, существование Guava внутри моего пакета - это деталь реализации, и разработчику даже не нужно знать, что я его использую.
Выбор между этими двумя вариантами - это компромисс. Вариант 2 имеет то преимущество, что мой пакет проще развертывать, потому что он автономный - все, что ему нужно, находится внутри него. С другой стороны, мой узел намного больше, чем нужно, что может стать проблемой, если многие другие пакеты также встроят свою собственную копию Guava.
Более серьезная проблема с вариантом 2 заключается в том, что все зависимости библиотеки теперь становятся зависимыми my. На самом деле Гуава - редкий пример библиотеки Java без каких-либо зависимостей... но многие другие библиотеки Java перетаскивают огромное дерево транзитивных зависимостей. Если вы используете этот подход, скажем, Hibernate, тогда ваш собственный пакет также будет иметь этот большой набор зависимостей. Это очень уродливо, очень быстро.
Итак, вы должны быть осторожны, чтобы не злоупотреблять Bundle-ClassPath
/Embed-Dependency
. Вы должны использовать его только в том случае, если зависимость (а) мала и не имеет транзитивных зависимостей, и (б) ваш пакет использует библиотеку в качестве внутренней детали реализации, т.е. Она не является частью вашего публичного API.
UPDATE
Я забыл ответить на ваш второй вопрос об экспорте. Ответ НЕТ, экспорт каких-либо "пакетов", которые вы положили на ваш Bundle-ClassPath
, НЕ станет экспортом вашего собственного пакета. На самом деле JAR, которые мы ставим на Bundle-ClassPath
, вообще не рассматриваются как связки, они просто JAR.
Вы можете экспортировать пакеты, которые поступают из JAR на вашем Bundle-ClassPath
, но вы должны сделать это в MANIFEST.MF своего собственного пакета.