0

我有一个捆绑包在 Servicemix 中运行。我去了我公司的存储库并将相应的 JAR 下载到我的本地机器上。我提取了那个 JAR,发现这个 JAR 只有一个文件夹 META-INF。在这个文件夹中,有一个 Manifest.mf 文件和我的资源,例如 Spring 配置文件和 Camel Context 文件。我得到了我的第一个问题:这个 JAR 的源文件在哪里,即 JAVA 类和所有文件。我只看到清单文件、pom.xml、另一个 pom 属性文件以及 spring 和 camel 的其他几个配置文件。

这导致了我的下一步。我的工作区中也有这个项目的本地副本。我在本地构建了这个项目,并在项目的目标目录中找到了 JAR。

现在以下步骤可能看起来很愚蠢,但无论如何我做了很少的实验。我提取了我在目标中找到的这个 JAR 并提取它以查看内容。我相信它是一个包,因为我使用了 maven-bundle-plugin,而且你无法通过查看 JAR 来判断它只是一个 JAR 或 OSGI 包。好的,所以我提取了 JAR 并猜测这次它确实有编译的 java 类。

这还没有结束,我又做了一件傻事。我从这个 JAR 中删除了已编译的类,并使它与我从公司的中央存储库中复制的完全相同。现在我使用 JDK 的 JAR 创建实用程序来创建 JAR。

现在我有两个 JARS:一个是我从公司的中央仓库下载的。另一个我自己创造的。它与另一个具有完全相同的内容。我什至在创建这个 JAR 时使用了相同的 manifest.mf。(因为我知道 Manifest 是 oSGI Bundle 的主干)。

我将这个捆绑包安全地复制到了我的服务器的主目录中。最后,我使用以下方法在 Servicemix 中安装了这个 Bundle/JAR:安装文件:path_to_JAR/JAR_FILE_NAME。

它安装成功。但是当我试图启动这个包时。它无法启动。通过使用显示异常,我看到了异常:它无法加载 bean 并且无法初始化应用程序上下文,然后是更具体的异常“ClassNotFound”异常。我知道它无法找到在我的应用程序上下文中定义的类。但是为什么?

我做了完全相同的步骤,我检查了很多次。如果我的无法启动,为什么较早的启动并运行。

对于在 OSGI 环境中工作过的其他人来说,这可能听起来很傻,但现在我开始重新考虑特别是 ServiceMix。

感谢您的任何建议。

4

1 回答 1

0

这与 OSGi 无关,更多的是关于您的应用程序。因为我不知道你的项目,我只能做一些假设。首先,您从 Company Repository 获得的 jar 很可能是“旧”版本,与您的本地资源不同。使用 Servicemix,您的包中很可能只包含蓝图或 spring xml,因为这些是 Camel-Blueprint/Spring 扩展器能够获取的有效资源。这些 XML 被解释,如果它们只使用标准 Camel 组件,则没有理由在包中包含单个类。现在回到你新创建的Bundle,显然你的camel-xml中有一些新的“代码”,它不仅需要标准的Camel类,还需要你自己创建的一些进程,现在这些类需要留在Bundle中!最好只部署新创建的 Bundle 及其所有类。您应该检查骆驼 xml 文件中发生了什么变化。

于 2013-06-25T06:40:04.597 回答