我要维护的软件解决方案有点问题。以前,我们已经将整个解决方案从Java 1.7迁移到Java 1.8,最后使大多数事情再次运行。
现在我遇到了一个问题。在我的内置产品中,某些类似乎无法加载。此类来自于jar中的捆绑包,这是调用捆绑包清单中的required-Bundle。
奇怪的是,启动osgi环境时似乎已解决了该捆绑包,因此我认为正确找到了.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类,但使用该捆绑包时我有一个需求捆绑包。
任何提示,这里会发生什么?
答案 0 :(得分:1)
TL; DR:
确保将类package
导出到META-INF/MANIFEST.MF
中。
长版:
即使该捆绑包已解析并处于活动状态,也不表示该类在其他捆绑包或系统的某些部分中可用。
该类所在的package
必须导出。每个捆绑包都有一个META-INF/MANIFEST.MF
。这基本上就像一个捆绑包描述。
在该描述中,有一个名为Export-Package
的字段,其中包含所有导出软件包的列表,因此可以在其他捆绑软件中使用。
通常,META-INF/MANIFEST.MF
是在Maven或Gradle中通过插件构建时创建的。检查这些插件的配置或查看它们如何工作。例如,某些插件不会导出impl
包以下的包。
因此,如果您将课程放在com.example.awesomeapp.impl.services
软件包中,则不会导出service
软件包。但这取决于您使用的插件等。
所有这些在您的IDE中都有效,因为它对类路径的处理与对OSGi环境的处理不同。简而言之:您的IDE或多或少只知道一个包含所有类的类路径,而OSGi使用了很多类路径(每个捆绑包一个,还有几个其他类路径),因此彼此“隐藏”了类。这就是为什么您的IDE可以加载类而OSGi捆绑包不能加载的原因。
答案 1 :(得分:0)
现在似乎可以使用了。当我尝试解决一个我认为与该问题无关的问题时,该问题消失了。我的构建服务器上有2个看似无关的jar文件(org.objectweb.asm_3.3.1和org.objectweb.asm_5.0.1)。该构建使用的是旧版本,然后我从构建服务器中删除了该版本,因此它只能使用较新的版本。 更改此设置后,一切似乎都可以正常运行,即使我真的不知道为什么这可以解决问题。 奇怪的是,这个jar以及该jar中包含的任何包或类都没有在我从我的异常接收到的堆栈跟踪中直接提及。