Jsp将如何识别在cq5或osgi中绑定的同名但不同版本的引用



正如前面提到的,我们可以在OSGI中安装多个不同版本的包。如果我的Bundle有两个版本并且都是活动的。我的jsp如何识别要引用的包?

简而言之,您不能在JSP中做到这一点。在AEM/Sling中,所有jsp(实际上是所有资源脚本)共享一个类加载器,并且没有办法指定包导入版本。因此,如果您有两个bundle导出具有不同版本的相同包(在您描述的场景中通常会发生这种情况),则无法知道jsp将使用哪个版本。我认为当前它是由具有最低ID的bundle导出的,但这根本不能保证,不应该依赖。

您应该尝试通过减少jsp对Java实现类的硬依赖来避免这种情况,而不是使用OSGi服务来完成您想要完成的任何事情。对于服务,通过使用过滤器来选择特定的服务实现相对容易。

例如,如果多个bundle都有使用com.myco.Foo接口注册的服务(该接口由一个公共bundle导出),并且每个服务注册都有一些唯一的属性集(在下面的示例中,此属性名为type,但这是任意的),您可以这样做:

<% 
   Foo[] foos = sling.getService(Foo.class, "(type=something)"); 
   if (foos != null && foos.length == 1) {
       Foo foo = foos[0];
       // do something with foo
   }
 %>

对于每个Import-Package包声明,必须有一个与相同包对应的Export-Packagebundle还可以为它导入或导出的包附加其他属性。

为例:-Bundle- name: Bundle A导入包:org.apache.foo; version = " 1.2.0 "

这意味着Bundle-A依赖于org.apache.foo包,其最低版本为1.2.0。虽然使用OSGI可以指定一个版本范围,但如果不指定一个范围,而是使用一个固定版本,则会产生固定值的"最小值"的含义。如果同一包有更高的版本,则将使用更高的版本。所以bundle - a不能正确解析,除非有相应的bundle B输出所需的包

Bundle- name: Bundle B出口包装:org.apache.foo; version = " 1.2.0 "

注意,反过来是不正确的。如果Bundle B导出了1.2.0版本,Bundle A不需要指定1.2.0版本。这是因为导入声明了它们需要的版本。导出的版本不指定任何内容。

你可以在depfinder-"http://localhost:****/system/console/depfinder"中检查你的包的现有版本

简单地说,我们可以说JSP只通过版本来识别包。如果有两个名称相似的版本,它将识别最新版本。当找到多个具有相同版本的包时,首先安装的包用于满足依赖项。

最新更新