我正在尝试使用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
正在按以下方式加载资源(resource
为default-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包本身应该正常工作......
答案 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开发人员联系,以表明他们存在问题但未成功。