我正在使用Eclipse开发OSGi包。我使用Eclipse OSGi运行时配置测试代码。
代码在那里工作正常,但是当我将bundle作为jar导出并尝试在另一个环境中使用它们时(例如pax-runner)我在运行时得到了ClassNotFound异常。捆绑安装正常,没有错误。我在equinox上执行命令:“diag bundle-number”,它说:“每个包都没有未解决的约束”。
我想知道是否有一个工具/方法可以知道,如果它需要任何外部库,那么给定的.jar包就不会在manifest.mf中描述。
答案 0 :(得分:2)
JBoss刚刚发布了一个关于依赖项的精彩开源诊断工具:http://jboss.org/tattletale
其中一个功能是通过内省分析jar文件,找到所有缺乏依赖关系。
答案 1 :(得分:2)
如果在运行时找到Import-Package
中列出的所有软件包(以及Require-Bundle
中列出的软件包),您的软件包将解析。如果您在解析后获得ClassNotFoundException
或NoClassDefFoundError
,则表示Import-Package
的内容错误。
看看Bnd tool by Peter Kriens。这将对从类中编译的字节码执行静态检查,以发现确切的依赖关系,并为您生成Import-Package
语句。通常,如果使用Bnd,除非按名称动态加载类,否则不应该看到ClassNotFound / NoClassDefFound。与Class.forName()
。
答案 2 :(得分:1)
我曾经做过类似的事情(我通过IKVM交叉编译Java到.NET,但需要Jars之间的依赖关系)我使用JarAnalyzer来创建依赖关系图。
答案 3 :(得分:1)
我使用SpringSource的bundlor-shell工具取得了成功。有使用它here的说明。您可以为它提供一个JAR,以及要从该JAR创建的新包的名称和版本。然后,它分析JAR中的类文件,并生成一个模板清单,用于导入它找到引用的任何包。
然后,困难的部分是确定哪些依赖项是可选的,以及每个依赖的包的版本。您必须阅读该网站的发布说明等,以便了解这一点。
如果捆绑包实际上没有导入任何包或需要其他捆绑包,您将得到“没有未解决的约束”;就OSGi运行时而言,该包将是可用的。但是一旦它访问外部类,就像你的情况一样,你会得到可怕的ClassNotFoundException
。
答案 4 :(得分:0)
如果您的代码使用MANIFEST.MF中未列出的类,Eclipse插件开发环境(PDE)将为您提供编译错误。运行时的ClassNotFound异常通常是由于将包导入错误地标记为可选 - 捆绑包解析,但它们不起作用。与您运行的捆绑包或包的不同版本进行编译也可能导致此类错误。