Bundle-ClassPath
旨在将依赖项包含在我们的包中,以便我们的包可以独立部署。
让我们举个例子。假设我的包中的代码使用了一个库,例如 Google Guava。我有两种打包我的捆绑包的选择:
只需创建我的包,其中只有我自己的代码。该包现在将具有Import-Package
声明对 Guava 的依赖关系的语句,任何想要将我的包部署到他的应用程序中的人也必须部署 Guava。
或者,我可以在我的包中包含 Guava 的副本,并从我的Bundle-ClassPath
. 部署我的包的人可以只部署我的包,而无需担心从哪里获取 Guava。事实上,我的 bundle 中 Guava 的存在是一个实现细节,部署者甚至不需要知道我正在使用它。
这两个选项之间的选择是一种权衡。选项 2 的优点是我的包更容易部署,因为它是独立的——它需要的一切都在其中。另一方面,我的包比它需要的大得多,如果许多其他包也嵌入了他们自己的番石榴副本,这可能会成为一个问题。
选项 2 的一个更严重的问题是库的所有依赖项现在也成为我的依赖项。实际上,Guava 是一个罕见的没有自身依赖的 Java 库示例……但许多其他 Java 库拖入了一个巨大的传递依赖树。如果您将这种方法与 Hibernate 一起使用,那么您自己的 bundle 也将具有那么大的依赖集。这变得非常难看,很快。
所以,你应该小心不要过度使用Bundle-ClassPath
/ Embed-Dependency
。只有在依赖项很小且没有传递依赖项的情况下,您才应该考虑使用它,并且 (b) 您的包使用该库作为内部实现细节,即它不是您的公共 API 的一部分。
更新
我忘了回答你关于出口的第二个问题。答案是否定的,您放置的任何“捆绑包”的出口Bundle-ClassPath
都不会成为您自己捆绑包的出口。事实上,我们放置的 JARBundle-ClassPath
根本不被视为捆绑包,它们只是 JAR。
您可以选择导出来自您的 JAR 中的包,Bundle-ClassPath
但您必须在您自己的包的 MANIFEST.MF 中执行此操作。