我有一个捆绑包在 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。
感谢您的任何建议。