我有一些遗留代码,用于监控我的应用程序cpu、内存等,我想将它们转换为捆绑包。现在,当我开始这个捆绑包时,它在抱怨
Missing Constraint: Import-Package: com.sun.management; version="0.0.0"
我使用OperatingSystemMXBean来访问JVM上的统计数据。
我的问题是,我可以在OSGI容器中使用这个类吗?如果可以,如何使用?或者我应该使用其他方法来监控我的应用程序。我从web前端向应用程序发出了一个RMI调用,以获取OSGi之前的节点性能数据。
发布于 2010-04-13 22:13:51
您可以尝试在交互式OSGi会话中安装它吗?
请参见this article示例。
osgi> ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
osgi> install file:bundles/FirstBundle-1.0.0.jar
Bundle id is 1
//Try starting
osgi> start 1
org.osgi.framework.BundleException: The bundle could not be resolved.
Reason: Missing Constraint: Import-Package: com.so.samples.osgi.second;
version="0.0.0"
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker
(BundleHost.java:305)
您可以诊断该问题:
osgi> diag 1
file:bundles/FirstBundle-1.0.0.jar [1]
Direct constraints which are unresolved:
Missing imported package com.so.samples.osgi.second_0.0.0.
并安装缺失的依赖项,前提是您知道从何处获取jar
(这很可能是您问题的症结所在,我没有确切的答案,除了将遗留jar转换为OSGi包,如wrap protocol或extension of an OSGi framework):
osgi> install file:bundles/SecondBundle-1.0.0.jar
Bundle id is 2
发布于 2010-04-14 22:39:11
下面是为了让它工作我必须做的事情。
我必须将com.sun.management添加到系统包的OSGI值中,因为我是新接触systemProperties的,这花了我一段时间才弄明白。我使用maven-pax-plugin,所以我需要添加以下属性。默认情况下它不工作的原因是equinox,我选择的osgi容器在默认情况下不在系统包中包含com.sun.*包。
通过使用bundle 0命令查看系统包,这一点很明显,因为包0始终是系统包,这对我来说是新的东西。
<param>--sp=com.sun.management</param>
添加此命令后,系统捆绑包包含com.sun.management和我的捆绑包,部署没有任何问题。
equinox默认情况下不在systemProperties中包含com.sun包的原因请参见here。(直接调用sun.*包的Java程序不能保证在所有兼容Java的平台上都能工作。事实上,即使在同一平台上的未来版本中,也不能保证这样的程序能正常工作。)
因此,有两种方法可以将com.sun添加到osgi容器中。
解决方案A':扩展包
它们充当片段;它们不是自己的束,而是附加到主机上。扩展捆绑包是一种特殊类型的片段,它只附加到系统捆绑包,以便交付框架的可选部分。可以使用这种机制来创建一个空的扩展,它只声明所需的包,将加载留给它的宿主包(在本例中是Framework)。我没有选择这条路,因为第二种选择实现起来更快。
解决方案B:引导委托
我最后选择的是启动委派。这允许用户创建“隐含的”包,这些包将始终由框架父类加载器加载,即使包没有提供适当的导入。我通过将系统包设置为包含com.sun.management来实现。
请参阅下面更详细地描述整个问题的优秀link。
https://stackoverflow.com/questions/2630069
复制相似问题