我正在尝试让库BioJava在OSGi上下文中工作。
为了使JAR进入OSGi上下文,我正在使用Maven插件p2-maven-plugin,它会生成文件Manifest.MF,与我所面临的异常有关的部分是:
Bundle-SymbolicName: org.biojava.core
Bundle-Version: 5.3.0
Import-Package: [snip],
org.slf4j;resolution:=optional,
[snap]
哪个对我来说还好。但是,当我访问使用slf4j的类时,出现标题异常:
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.biojava.nbio.core.sequence.template.AbstractCompoundSet.<clinit>(AbstractCompoundSet.java:40)
at org.biojava.nbio.core.sequence.io.ABITrace.getSequence(ABITrace.java:179)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory cannot be found by org.biojava.core_5.3.0
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:511)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:414)
现在很容易在任何地方找到此异常,因为许多人已经尝试(但失败)安装slf4j。我检查了the documentation或SO问题ClassNotFoundException: org.slf4j.LoggerFactory之类的网站,因此尝试添加以下捆绑包:
但是两者都不起作用。也许OSGi容器有问题,但是slf4j JAR的捆绑包信息和导出包都是开箱即用的,因此我假设这些工作正常。而且BioJava JAR具有导入包,因此我不知道为什么它无法找到该类。
哦,我检查过,LoggerFactory
存在于slf4j-api中,所以也不是。
有人设法使slf4j在OSGi中工作吗?还是失败了,有什么办法可以用某种Java代理替换那个愚蠢的依赖关系,这样我就不再需要打破的依赖关系了?
resolution:=optional
表示当分发包解析时,它将无法访问该软件包。允许框架解析包而不访问包。如果捆绑软件需要访问软件包,为什么要使软件包的分辨率为可选?