Jsp将如何识别在cq5或osgi中具有相同名称但不同版本的will bundle?

Jsp将如何识别在cq5或osgi中具有相同名称但不同版本的will bundle?,osgi,aem,osgi-bundle,Osgi,Aem,Osgi Bundle,正如前面提到的,我们可以在OSGI中安装多个不同版本的捆绑包。因此,如果我有两个版本的捆绑包,并且都是活动的。我的jsp如何识别哪个包必须引用?简而言之,您不能从jsp中执行此操作。在AEM/Sling中,所有JSP(事实上,所有资源脚本)共享一个类加载器,并且无法指定包导入版本。因此,如果您有两个bundle导出具有不同版本的相同包(这通常是您描述的场景中会发生的情况),那么您就无法知道JSP中将使用哪个版本。我相信目前它是由具有最低ID的捆绑包导出的,但这根本不能保证,也不应该依赖于它 您应

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

简而言之,您不能从jsp中执行此操作。在AEM/Sling中,所有JSP(事实上,所有资源脚本)共享一个类加载器,并且无法指定包导入版本。因此,如果您有两个bundle导出具有不同版本的相同包(这通常是您描述的场景中会发生的情况),那么您就无法知道JSP中将使用哪个版本。我相信目前它是由具有最低ID的捆绑包导出的,但这根本不能保证,也不应该依赖于它

您应该通过减少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
   }
 %>

对于每个进口包装声明,必须有一个与相同包装对应的出口包装 捆绑包还可以将其他属性附加到它导入或导出的包

例如:- 捆绑包名称:捆绑包A 导入包:org.apache.foo;version=“1.2.0”

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

捆绑包名称:捆绑包B 导出包:org.apache.foo;version=“1.2.0”

请注意,反之亦然。如果捆绑包B导出了版本1.2.0,则不需要捆绑包A指定版本1.2.0。 这是因为导入声明了它们需要的版本。导出的版本没有指定任何内容

您可以在depfinder中检查捆绑包的现有版本-“:***/system/console/depfinder”

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