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

OpenSAML3 resource not found 'default-config.xml' in OSGi container

我正在尝试使用 opensaml servicemix 包 (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.

时收到 "resource not found" 错误
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 包应该可以正常工作...

我找到了 "resource not found" 问题的解决方案,但它更像是一个 hack...

在偶然发现 SO post 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

我遇到了同样的问题,但使用的是 Apache Felix OSGI。 使用 "resource not found" 你是对的,正如我在 OSGI 环境中发现的那样使用许多类加载器来打包,但是 SAML v3 框架加载资源是这样的:

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

你的解决方案适用于初始化,但对我来说,当我尝试签名消息或验证时,仍然有这个问题,所以我用 bundle ClassLoader 替换了资源加载:

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

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

我试图与 servicemix 开发人员联系,向他们指出这个问题,但没有成功。