3

我正在使用 Eclipse 开发 OSGi 包。我使用 Eclipse OSGi 运行时配置测试代码。

代码在那里运行良好,但是当我将包导出为 jar 并尝试在另一个环境(例如 pax-runner)中使用它们时,我在运行时遇到 ClassNotFound 异常。捆绑包安装得很好,没有错误。我在 Equinox 上执行命令:“diag bundle-number”,它说:“没有未解决的约束”为每个包。

我想知道对于给定的 .jar 包是否需要任何外部库,这在 manifest.mf 中没有描述,是否有需要了解的工具/方法。

4

5 回答 5

2

JBoss 刚刚发布了一个很棒的关于依赖关系的开源诊断工具:http: //jboss.org/tattletale

其中一项功能是通过自省分析 jar 文件,找到所有缺少的依赖项。

于 2010-08-31T14:35:28.643 回答
2

如果在运行时找到所有列出的包Import-Package(以及列出的包) ,您的包将解析。Require-Bundle如果得到ClassNotFoundExceptionNoClassDefFoundError解决后,则表示内容Import-Package错误。

看看Peter Kriens 的 Bnd 工具。这将对从您的类编译的字节码执行静态检查以发现确切的依赖关系,并Import-Package为您生成语句。一般来说,如果你使用 Bnd,你应该永远不会看到 ClassNotFound/NoClassDefFound,除非通过名称动态加载类,例如使用Class.forName().

于 2010-09-02T23:58:56.067 回答
1

不久前我做过类似的事情(我通过 IKVM 将 Java 交叉编译到 .NET,但需要 Jars 之间的依赖关系)我使用JarAnalyzer创建依赖关系图。

于 2010-08-31T14:34:10.063 回答
1

我使用 SpringSource 的 bundler-shell 工具取得了成功。这里有使用说明。您给它一个 JAR,以及您想从该 JAR 创建的新包的名称和版本。然后它分析 JAR 中的类文件并生成一个模板清单,该清单导入它找到引用的任何包。

然后,困难的部分是确定哪些依赖项是可选的,以及每个包的依赖版本。您必须阅读网站、发行说明等,才能让库弄清楚这一点。

如果捆绑包实际上没有导入任何包或需要其他捆绑包,您将获得“没有未解决的约束”;就 OSGi 运行时而言,捆绑包将是可用的。但是一旦它访问一个外部类,就像你的情况一样,你会得到可怕的ClassNotFoundException.

于 2010-09-03T22:16:30.343 回答
0

如果您的代码使用了 MANIFEST.MF 中未列出的类,Eclipse 插件开发环境 (PDE) 会给您带来编译错误。运行时的 ClassNotFound 异常通常是由于错误地将包导入标记为可选引起的 - 捆绑包解析,但它们不起作用。针对不同版本的捆绑包或包进行编译而不是针对您运行的版本也可能导致此类错误。

于 2012-05-22T14:23:28.173 回答