2013-06-25 81 views
0

我有一个软件包在Servicemix中运行。我去了我公司的仓库,并将相应的JAR下载到我的本地机器上。我提取了这个JAR,发现这个JAR只有一个文件夹META-INF。 在这个文件夹中,有一个Manifest.mf文件和我的资源,比如Spring配置文件和Camel Context文件。 那里我得到了我的第一个问题:这个JAR的源文件,即JAVA类和全部文件在哪里。只有我看到的东西有清单文件,pom.xml,另一个pom属性文件以及其他用于spring和camel的配置文件。无法在servicemix中启动软件包

这导致了我的下一步。我在工作区也有一个本地项目的副本。我在本地构建了这个项目,并在项目的目标目录中找到了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

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

+0

谢谢,你的一些观点对我来说真的很有意义。 – Ashish

+0

我检查了骆驼xml文件,甚至是类。除了我将版本更改为SNAPSHOT即没有改变。我去了servicemix并卸载了现有的(已启动并运行),然后安装了这个新的。在pom.xml中没有任何变化,这意味着我不需要在servicemix中安装任何附加功能或约束。 – Ashish

+0

你确定旧版本是“相同的”。 –