【问题标题】:OSGi errors when running jackrabbit 2.11 in Karaf 2.4 / Felix 4.x在 Karaf 2.4 / Felix 4.x 中运行 jackrabbit 2.11 时出现 OSGi 错误
【发布时间】:2015-12-01 10:19:24
【问题描述】:

我正在尝试使用 JackRabbit 2.11.1 连接到远程仓库(使用 jackrabbit-jcr-rmi)。这些捆绑包在 JBoss Fuse 6.2 中运行,该版本具有 Apache Karaf 2.4 / Felix 4.4。在启动时,我得到以下异常。 如果我尝试使用 jackrabbit-bundle 我得到 “缺少约束:导入包:com.ibm.db2.jcc;版本=“0.0.0”” 所以我很困惑,JackRabbit 2.x OSGi 准备好了吗?或者我需要使用 Sling 或 Oak 还是 ....?

Caused by: org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision wrap_mvn_org.apache.jackrabbit_jackrabbit-core_2.11.1 [270.0] because it exports package 'org.apache.jackrabbit.core.config' and is also exposed to it from bundle revision org.apache.jackrabbit.jackrabbit-data [276.0] via the following dependency chain:
wrap_mvn_org.apache.jackrabbit_jackrabbit-core_2.11.1 [270.0]
import: (osgi.wiring.package=org.apache.jackrabbit.core.data.db)
export: osgi.wiring.package=org.apache.jackrabbit.core.data.db; uses:=org.apache.jackrabbit.core.config
export: osgi.wiring.package=org.apache.jackrabbit.core.config
org.apache.jackrabbit.jackrabbit-data [276.0]
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4006)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.felix.framework.Felix.startBundle(Felix.java:2045)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:963)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.karaf.features.internal.FeaturesServiceImpl.doInstallFeatures(FeaturesServiceImpl.java:546)[9:org.apache.karaf.features.core:2.4.0.redhat-620133]

另见https://issues.apache.org/jira/browse/JCR-3917

【问题讨论】:

  • 按照aries.apache.org/modules/spi-fly.html 上的说明,我离我更近了一步,但“消费”部分(我的罐子)仍然看不到提供者。见评论issues.apache.org/jira/browse/…
  • 我唯一可以建议的是,您在这里有一个不能一起工作的捆绑包组合。特别是我会怀疑wrap_mvn_org.apache.jackrabbit_jackrabbit-core_2.11.1。这听起来像是用一些自动过程包装的,因此元数据质量可能很差。

标签: osgi jcr


【解决方案1】:

我用一个可怕的 hack 解决了它。

  • 将我需要的依赖项嵌入到我自己的 jar 中。
  • 将 ContextClassLoader 设置为提供类的类加载器(SPI 最初应该做的事情但没有奏效,可能是因为我需要包装的 jar 比我做的多?)。

所以,在我做的 maven-bundle-plugin 中:

<Embed-Dependency>jackrabbit-jcr2dav*,jackrabbit-jcr2spi*,jackrabbit-jcr-commons*;scope=compile;inline=false</Embed-Dependency>

在我的消费代码中:

ClassLoader originalContextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(Jcr2davRepositoryFactory.class.getClassLoader());
//
repository = JcrUtils.getRepository(uri);
session = getSession();
// restore original classloader
Thread.currentThread().setContextClassLoader(originalContextClassLoader);

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2018-04-27
    • 2021-07-22
    相关资源
    最近更新 更多