OSGi errors when starting jackrabbit 2.11 in Karaf 2.4 / Felix 4.x

I am trying to use JackRabbit 2.11.1 to connect to a remote repo (using jackrabbit-jcr-rmi). Packages run in JBoss Fuse 6.2, which has Apache Karaf 2.4 / Felix 4.4 under the hood. On startup, I get an exception below. If I try to use the jabrabbit-bundle package, I get "Missing restriction: Import-Package: com.ibm.db2.jcc; version =" 0.0.0 "" So I'm confused, is JackRabbit 2.x OSGi ready? or do I need to use Sling or Oak, or ....?

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] 

See also https://issues.apache.org/jira/browse/JCR-3917

+5
source share
1 answer

I solved it with a terrible hack.

  • Insert the dependencies I need into my own jar.
  • Set ContextClassLoader to the loader class of the collateral class (what should the SPI do first but not work, perhaps because I needed to wrap more cans than the one I made?).

So in maven-bundle-plugin I did:

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

And in my consumer code:

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

Source: https://habr.com/ru/post/1237160/


All Articles