1

在探索了 OSGi 框架之后,我开发了一个示例 Web 应用程序。Web 应用程序包(.war 或 .jar)被打包在一个 eba 中。war 文件在其目录中包含一堆嵌入的 jar 文件。这些WEB-INF/lib jar 已(using maven-bundle-plugin根据 jar 之间的关系转换为 OSGi bundles 以及所需的导出和导入包。现在我什至不得不提到(WEB-INF/lib)bundle-classpath 中的所有这些 jar。上述工作是因为一个包(wab 也是一个包)可以在其中包含一个或多个 jarfile,并使用 Bundle-Classpath manifest.mf 条目指向它们。

如果我没有在 bundle-classpath 中包含 jar,我会得到一个ClassNotFoundException.

问题是,那么将 jars 转换为 osgi bundles 是没有意义的。显然,其中的所有 jarsWEB-INF/lib都是由同一个类加载器(即 wab 的类加载器)加载的,所以我们没有获得 OSGi 的主要好处,这主要是一个每个捆绑类加载器概念?

4

1 回答 1

1

将 jars 放在 WEB-INF/lib 中是旧式的 normal-java 处理依赖项的方式,而将它们放在 war 之外是新式的 OSGi 处理它们的方式。

通过将战争的依赖项打包在 WEB-INF/lib 中,您将它们视为普通的 jar(请记住,bundle 也是 jar)。所以在那种情况下,你是对的,使用捆绑包没有多大意义。

使用 wab 而不是战争的好处之一是摆脱可怕的 100 Mb 单体战争。与其将包打包到 WEB-INF/lib 中,不如尝试让 war 使用 Import-Package: 导入它需要的包,并将依赖项打包到 eba 中。(如果你不记得让战争导入它需要的包,你会得到你所看到的类未找到异常,因为 OSGi 容器不会知道你的战争需要这些包。)

于 2014-03-22T07:22:40.107 回答