我在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。
已成功安装。但是当我试图开始这个捆绑。它无法启动。通过使用display-exception,我看到了异常:它无法加载bean而无法加载 初始化应用程序上下文后跟一个更具体的异常“ClassNotFound”异常。我知道它无法找到我的应用程序上下文中定义的类。但是,为什么呢?
我做了完全相同的步骤,我多次检查。如果我的无法启动,为什么早期的启动并运行。
对于在OSGI环境中工作的其他人来说,这听起来可能很愚蠢,但现在我开始重新考虑特别是ServiceMix。
感谢您的任何建议。
答案 0 :(得分:0)
这与OSGi无关,它更适用于您的应用程序。 由于我不知道你的项目我只能做一些假设。 首先,您从公司资源库获得的jar很可能是“较旧”版本,与本地资源不同。使用Servicemix,很可能只在您的包中有蓝图或弹簧xmls,因为这些是Camel-Blueprint / Spring扩展器能够获取的有效资源。解释这些XML,如果只使用标准的Camel组件,则没有理由在bundle中包含单个Class。 现在回到你新创建的Bundle,显然你的camel-xml中有一些新的“Code”,它不仅需要标准的Camel类,还需要你自己创建的一些进程,现在这些类需要保留在Bundle中! 最好只是部署新创建的Bundle及其所有类。您应该检查camel xml文件中的更改内容。