gpt4 book ai didi

java - 已解析 OSGI 包上的 ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-02 09:53:07 25 4
gpt4 key购买 nike

我正在维护的软件解决方案有一点问题。我们之前已将整个解决方案从 Java 1.7 迁移到 Java 1.8,并且最终让大部分内容再次运行。

现在我遇到了一个问题。在我构建的产品中,某个类似乎无法加载。此类来自 jar 中的包,它是调用包的 list 中的必需包。

奇怪的是,在启动 osgi 环境时, bundle 似乎已解析,因此我认为 .jar 已正确找到。一旦程序尝试加载某个对话,我就会收到 ClassNotFoundException。

在我的 IDE 中,对话工作完美,只是构建的产品似乎无法在运行时加载该类(即使包含它的包可以解析)。

用图形表示正在发生的事情:

+-----------------------+   +---------------------------+
|xtext....jar | |MyProject |
|. | |. |
|. | |. | +-------------------------+
|. | | MANIFEST.MF | |ClassNotFoundException |
| MANIFEST.MF +---> -Bundle-Name:MyBundle +--->+at runtime in built |
| -Bundle-Name:X-Bundle| | -Require-Bundle:X-Bundle | +version |
| -Export-Package:x | | | +-------------------------+
|. | | |
|. | +---------------------------+
|DeltaConverter.class |
| |
+-----------------------+

运行时在构建版本中找不到 DeltaConverter 类,尽管 bundle 已解析并且我为使用它的 bundle 准备了一个 require bundle 。

任何提示,这里可能发生什么?

最佳答案

TL;博士:

确保您的类package已导出到META-INF/MANIFEST.MF中。

<小时/>

长版:

即使 Bundle 已解析并处于 Activity 状态,也不意味着该类在其他 Bundle 或系统部分中可用。

必须导出该类所在的。每个 bundle 都有一个 META-INF/MANIFEST.MF。这基本上就像 bundle 描述。

在该描述中,有一个名为 Export-Package 的字段,其中包含所有导出的包的列表,因此可以在其他包中使用。

通常,META-INF/MANIFEST.MF是在 Maven 或 Gradle 中通过插件构建期间创建的。检查这些插件的配置或了解它们是如何工作的。例如,某些插件不会导出 impl 包以下的包。

因此,如果您的类位于包 com.example.awesomeapp.impl.services 中,则 service 包将不会被导出。但这取决于您使用的插件等。

所有这些都可以在您的 IDE 中运行,因为它处理类路径的方式与您的 OSGi 环境不同。简而言之:您的 IDE 或多或少只知道一个包含所有类的类路径,而 OSGi 使用许多类路径(每个包一个和几个其他类路径),因此相互“隐藏”类。这就是为什么您的 IDE 可以加载类,而您的 OSGi 包却不能。

关于java - 已解析 OSGI 包上的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56171128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com