【发布时间】:2011-11-20 11:18:22
【问题描述】:
根据 OSGi 文档,OSGi 旨在帮助防止 ClassPath 问题。
例如,来自“OSGi in action”:
在启动应用程序时出现 ClassNotFoundExceptions,因为 类路径不正确。 OSGi 可以通过确保代码提供帮助 在允许代码执行之前满足依赖关系。
但是,由于我们已将 java 应用程序切换到 OSGi,因此我看到的 ClassNotFoundExceptions 尤其是 NoClassDefFoundErrors 比以往任何时候都多。 OSGI 类加载器不再找到以前加载正常的类,更糟糕的是:您在运行时遇到错误,这意味着您无法轻松检查它,除非手动测试应用程序的每个角落。
例如,我们的应用程序在 OSGi 下运行良好,但我们收到来自 beta 测试人员的报告,他们无法再将文档导出为 PDF。确实,当我查看它时,我发现此功能导致记录异常:
java.lang.NoClassDefFoundError: org/w3c/dom/Node
那么,OSGi 是否真的创造了比它解决的更多的类路径问题?
更重要的是:我如何测试我的类路径与所有必要的 Import-Package 语句等是否一致。在我在错误报告中了解它们之前?
【问题讨论】:
-
“除了手动测试应用程序的每个角落” - erm 自动化测试? (这同样适用于任何应用程序)如果您在迁移之前有测试套件,那么您会在测试人员之前发现这些错误。要测试您的捆绑包是否正确连接,您需要进行一些集成测试 - 我们为此使用 Pax Exam 并进行简短的集成测试(当前捆绑包及其合作者)以及一些较长的端到端测试(测试整个应用程序)。
-
对于那些在搜索 OSGi NoClassDefFound 时发现此堆栈溢出的人......请记住,执行 OSGi 包代码的当前 Java 线程决定了“活动”类加载器,即线程上下文类加载器 (TCCL)。 “活动”类加载器可能不是 OSGi 容器为捆绑代码创建的类加载器。所以为了让一切顺利,有时你必须手动切换线程的 TCCL。
-
参见 2012 年。尼尔·巴特利特。 “可怕的线程上下文类加载器”,blogs.paremus.com/2012/10/….
标签: osgi noclassdeffounderror classnotfoundexception