在探索OSGi框架之后,我开发了一个示例Web应用程序.Web Application Bundle(.war或.jar)打包在eba中。
war文件在WEB-INF/lib
中包含一堆嵌入式jar文件
目录。这些罐子已根据罐子之间的关系转换为OSGi包(using maven-bundle-plugin
)和所需的导出和导入包。
现在我甚至要在bundle-classpath中提到所有这些jar (WEB-INF/lib)
。
上面的工作原理是因为bundle(wab也是一个bundle)可以在其中包含一个或多个jar文件,并使用Bundle-Classpath manifest.mf条目指向它们。
Incase我没有在bundle-classpath中包含jar我得到ClassNotFoundException
。
问题是,然后没有必要将jar转换为osgi bundle。显然,WEB-INF/lib
中的所有jar都是由同一个类加载器(即wab的类加载器)加载的,所以我们没有收获OSGi的主要好处主要是每捆绑类加载器概念?
答案 0 :(得分:1)
将jar放入WEB-INF / lib中是处理依赖关系的旧式普通java方法,将它们置于战争之外是新式OSGi处理它们的方式。
通过将war的依赖包装在WEB-INF / lib中,你将它们视为普通的jar(记住bundle也是一个jar)。所以在这种情况下,你使用捆绑包没有多大意义。
使用wabs而不是战争的好处之一是摆脱可怕的100 Mb整体战争。而不是将包打包在WEB-INF / lib中,尝试让war使用Import-Package:导入所需的包,并将依赖包打包到eba中。 (如果你不记得让战争导入它需要的包,你会得到你看到的类找不到的异常,因为OSGi容器不知道你的战争需要那些包。)