在OSGi容器中找不到OpenSAML3资源'default-config.xml'

时间:2016-06-21 15:14:57

标签: java osgi osgi-bundle opensaml maven-bundle-plugin

我正在尝试使用opensaml servicemix bundle(org.apache.servicemix.bundles:org.apache.servicemix.bundles.opensaml:jar:3.2.0_1)在Apache Karaf(4.0.5)上运行的OSGi包中升级到OpenSAML 3。

解析SAML的测试工作正在进行中,所以我认为我走在了正确的轨道上。但是,如果我在Karaf上安装捆绑包,则在尝试加载default-config.xml时会收到“资源未找到”错误。

2016-06-21 16:29:10,477 | INFO  | ool-120-thread-1 | InitializationService            | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Initializing OpenSAML using the Java Services API
2016-06-21 16:29:10,478 | DEBUG | ool-120-thread-1 | InitializationService            | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Initializing module initializer implementation: org.opensaml.core.xml.config.XMLObjectProviderInitializer
2016-06-21 16:29:10,487 | DEBUG | ool-120-thread-1 | XMLConfigurator                  | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | XMLObjectProviderRegistry did not exist in ConfigurationService, will be created
2016-06-21 16:29:10,488 | DEBUG | ool-120-thread-1 | ractXMLObjectProviderInitializer | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Loading XMLObject provider configuration from resource 'default-config.xml'
2016-06-21 16:29:10,489 | ERROR | ool-120-thread-1 | ractXMLObjectProviderInitializer | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Problem loading configuration resource
org.opensaml.core.xml.config.XMLConfigurationException: Resource not found
    at org.opensaml.core.xml.config.AbstractXMLObjectProviderInitializer.init(AbstractXMLObjectProviderInitializer.java:54)[388:org.apache.servicemix.bundles.opensaml:3.2.0.1]
    at org.opensaml.core.xml.config.XMLObjectProviderInitializer.init(XMLObjectProviderInitializer.java:45)[388:org.apache.servicemix.bundles.opensaml:3.2.0.1]
    at org.opensaml.core.config.InitializationService.initialize(InitializationService.java:56)[388:org.apache.servicemix.bundles.opensaml:3.2.0.1]

AbstractXMLObjectProviderInitializer正在按以下方式加载资源(resourcedefault-config.xml):

Thread.currentThread().getContextClassLoader().getResourceAsStream(resource)

default-config.xml位于(opensaml)jar的根目录,这让我想知道这是不是找不到的原因。

我在我的项目中使用maven-bundle-plugin,并且依赖于opensaml类的依赖和各种用法,我为以下包提供了显式导入(Import-Package):

org.opensaml.core.xml.config,
org.opensaml.saml.config,
org.opensaml.xmlsec.config,

我的捆绑包清单或其他地方是否有任何遗漏,以使其工作?我认为servicemix发布的opensaml包本身应该正常工作......

2 个答案:

答案 0 :(得分:1)

我找到了“资源未找到”问题的解决方案,但它比任何事情都更糟糕......

在SO帖子Better handling of Thread Context ClassLoader in OSGi上遇到障碍后,我调整了我的代码以便在调用它之前设置InitializationService的类加载器,现在可以在初始化期间找到所讨论的XML。

    // adapt TCCL
    Thread thread = Thread.currentThread();
    ClassLoader loader = thread.getContextClassLoader();
    thread.setContextClassLoader(InitializationService.class.getClassLoader());
    try {
        InitializationService.initialize();
    } finally {
        // reset TCCL
        thread.setContextClassLoader(loader);
    }

但是,我注意到我的包中的SPI配置org.opensaml.core.config.Initializer没有加载,我还没有找到适当的修复方法。我目前的解决方法是显式调用我需要的初始化器的init方法:

  • org.opensaml.saml.config.XMLObjectProviderInitializer
  • org.opensaml.saml.config.SAMLConfigurationInitializer
  • org.opensaml.xmlsec.config.XMLObjectProviderInitializer

请注意以下内容也是必需的,但默认情况下会初始化(因为在opensaml包中有SPI配置org.opensaml.core.config.Initializer - 它会被加载):

  • org.opensaml.core.xml.config.XMLObjectProviderInitializer
  • org.opensaml.core.xml.config.GlobalParserPoolInitializer

答案 1 :(得分:0)

我有同样的问题,但使用Apache Felix OSGI。 使用“找不到资源”是正确的,正如我在OSGI环境中发现的那样,使用许多ClassLoader作为bundle,但是SAML v3框架加载了这样的资源:

ClassLoader classLoader =Thread.currentThread().getContextClassLoader();
Class<?> clazz = classLoader.loadClass(className);
//And same in InitializationService
ServiceLoader<Initializer> serviceLoader = getServiceLoader();
Iterator iter = serviceLoader.iterator();

您的解决方案适用于初始化,但对我来说,当我尝试签名消息或验证时,仍然存在此问题,因此我将资源加载替换为捆绑ClassLoader无处不在:

BundleWiring bundleWiring = bundleContext.getBundle().adapt(BundleWiring.class);
ClassLoader loader = bundleWiring.getClassLoader();

第二个问题是opensaml servicemix bundle的问题,它只包含CORE模块的服务初始化引用,你可以在META-INF / services中找到它,我通过在我的自定义初始化程序中初始化这个服务来解决这个问题。

我试图与servicemix开发人员联系,以表明他们存在问题但未成功。