Gemini Blueprint - PackageAdmin 服务引用在 IBM Liberty 中使用 spring mvc 返回 null

Gemini Blueprint - PackageAdmin service reference is returning null with spring mvc in IBM Liberty

我正在尝试使用 gemini blueprint virgo DM 在 IBM Websphere liberty 服务器中部署 spring osgi 应用程序。部署应用程序时,我遇到以下错误,显示“....需要 PackageAdmin 服务。有人对此有什么想法吗?

java.lang.IllegalStateException: org.osgi.service.packageadmin.PackageAdmin service is required at org.eclipse.gemini.blueprint.io.internal.resolver.PackageAdminResolver.run(PackageAdminResolver.java:179) at org.eclipse.gemini.blueprint.io.internal.resolver.PackageAdminResolver.run(PackageAdminResolver.java:174) at java.security.AccessController.doPrivileged(Native Method) at org.eclipse.gemini.blueprint.io.internal.resolver.PackageAdminResolver.getPackageAdmin(PackageAdminResolver.java:174) at org.eclipse.gemini.blueprint.io.internal.resolver.PackageAdminResolver.getImportedBundles(PackageAdminResolver.java:67) at org.eclipse.gemini.blueprint.io.OsgiBundleResourcePatternResolver.findClassPathMatchingResources(OsgiBundleResourcePatternResolver.java:217) at org.eclipse.gemini.blueprint.io.OsgiBundleResourcePatternResolver.findResources(OsgiBundleResourcePatternResolver.java:154) at org.eclipse.gemini.blueprint.io.OsgiBundleResourcePatternResolver.getResources(OsgiBundleResourcePatternResolver.java:186) at org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext.getResources(AbstractOsgiBundleApplicationContext.java:439) at org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext.getResources(ServerOsgiBundleXmlWebApplicationContext.java:346) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:270) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:248) at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:87) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1411) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:172) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392) ... 25 more

从 Liberty 的修复包 8.5.5.9 开始,PackageAdmin 将不可用于应用程序区域,除非您使用 IBM-API-Service[= 创建一个导出包管理服务的自定义 Liberty 功能部件29=] header.

  1. 按照 this article

  2. 中的说明创建 Liberty 功能部件
  3. 确保功能导出 PackageAdmin,如下例所示

  4. 使用 usr:myfeature

    向 server.xml 声明您的自定义功能
    Subsystem-ManifestVersion: 1.0
    IBM-Feature-Version: 2
    IBM-ShortName: myfeature
    Subsystem-SymbolicName: myfeature;visibility:=public 
    Subsystem-Version: 1.0.0
    Subsystem-Type: osgi.subsystem.feature
    Manifest-Version: 1.0
    IBM-API-Service: javax.xml.parsers.SAXParserFactory,
     org.osgi.service.packageadmin.PackageAdmin,
     org.osgi.service.cm.ConfigurationAdmin
    

根据8.5.5.9 fixpack中的一个defect fix的描述,IBM做出这个改变是因为Liberty将自己的服务泄露给了应用程序,所以现在Liberty注册的OSGi服务对应用程序是不可见的应用程序,除非您创建如下所示的功能以明确导出您需要的功能。