Java 未找到OpenSAML3资源';默认config.xml';在OSGi容器中

Java 未找到OpenSAML3资源';默认config.xml';在OSGi容器中,java,osgi,osgi-bundle,opensaml,maven-bundle-plugin,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)升级到ApacheKaraf(4.0.5)上运行的OSGi bundle中的OpenSAML 3 一个解析SAML的测试正在运行,所以我认为我的思路是正确的。但是,如果我在Karaf上安装包,当它试图加载default config.xml时,我会得到一个“resour

我正在尝试使用OpenSAML servicemix bundle(
org.Apache.servicemix.bundles:org.Apache.servicemix.bundles.OpenSAML:jar:3.2.0_1
)升级到ApacheKaraf(4.0.5)上运行的OSGi bundle中的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
正在加载资源,如下所示(
resource
is
default config.xml
):

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

我在我的项目中使用了
maven bundle插件
,在依赖性和opensaml类的各种使用之上,我为以下包提供了显式导入(
Import-Package
):

org.opensaml.core.xml.config,
org.opensaml.saml.config,
org.opensaml.xmlsec.config,
在我的包的清单或其他地方是否有任何我遗漏的东西来完成这项工作?我认为servicemix本身发布的opensaml包应该可以正常工作…

我找到了“未找到资源”问题的解决方案,但这更像是一种黑客行为

在跌跌撞撞地阅读了SO文章之后,我修改了代码,在调用
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);
    }
然而,我注意到我的bundle中的SPI config
org.opensaml.core.config.Initializer
没有被加载,我还没有找到合适的修复方法。我当前的解决方法是显式调用我需要的初始值设定项的init方法:

  • org.opensaml.saml.config.XMLObjectProviderInitializer
  • org.opensaml.saml.config.SAMLConfigurationInitializer
  • org.opensaml.xmlsec.config.XMLObjectProviderInitializer
请注意,以下内容也是必需的,但会根据默认值进行初始化(因为opensaml bundle中的SPI config
org.opensaml.core.config.Initializer
,它会被加载):

  • org.opensaml.core.xml.config.XMLObjectProviderInitializer
  • org.opensaml.core.xml.config.GlobalParserPoolInitializer
我找到了“未找到资源”问题的解决方案,但这更像是一种黑客行为

在跌跌撞撞地阅读了SO文章之后,我修改了代码,在调用
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);
    }
然而,我注意到我的bundle中的SPI config
org.opensaml.core.config.Initializer
没有被加载,我还没有找到合适的修复方法。我当前的解决方法是显式调用我需要的初始值设定项的init方法:

  • org.opensaml.saml.config.XMLObjectProviderInitializer
  • org.opensaml.saml.config.SAMLConfigurationInitializer
  • org.opensaml.xmlsec.config.XMLObjectProviderInitializer
请注意,以下内容也是必需的,但会根据默认值进行初始化(因为opensaml bundle中的SPI config
org.opensaml.core.config.Initializer
,它会被加载):

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

我也有同样的问题,但是使用ApacheFelixOSGi。 对于“未找到资源”,您是对的,正如我在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();
第二个问题是opensaml servicemix捆绑包的问题,它包含服务初始值设定项,仅用于核心模块,您可以在META-INF/services中找到它,我通过在自定义初始值设定项中初始化此服务来解决此问题


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

我也有同样的问题,但与ApacheFelixOSGi有关。 对于“未找到资源”,您是对的,正如我在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();
第二个问题是opensaml servicemix捆绑包的问题,它包含服务初始值设定项,仅用于核心模块,您可以在META-INF/services中找到它,我通过在自定义初始值设定项中初始化此服务来解决此问题

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