我有一些遗留代码用于监视我想要转换为捆绑包的应用程序cpu,内存等。现在,当我开始这个捆绑它抱怨
Missing Constraint: Import-Package: com.sun.management; version="0.0.0"
我曾使用OperatingSystemMXBean来访问JVM上的统计信息。
我的问题是我可以在OSGI容器中使用此类,如果是这样,怎么办?或者我应该使用其他方式来监控我的应用程序。我正在从Web前端对应用程序进行RMI调用,以获得OSGi之前的节点性能数据。
答案 0 :(得分:2)
以下是我必须要做的工作。
我不得不将com.sun.management添加到系统包的systemProperties值,因为我是OSGI的新手,这花了我一段时间才弄明白。我使用maven-pax-plugin,所以我需要添加以下属性。它默认不起作用的原因是equinox我选择的osgi容器默认情况下不包括系统包中的com.sun。*包。
通过使用bundle 0命令查看系统包这是显而易见的,因为bundle 0始终是系统包,这对我来说是新的。
<param>--sp=com.sun.management</param>
添加此命令后,系统包中包含com.sun.management和我的捆绑包,没有任何问题。
默认情况下,equinox不包含systemProperties中的com.sun包,原因请参见here。 (直接调用sun。*包的Java程序不能保证在所有兼容Java的平台上运行。事实上,即使在同一平台上的未来版本中也不能保证这样的程序能够正常工作。)
因此,有两个选项可以将com.sun添加到osgi容器中。
解决方案A':扩展包
这些充当片段;它们不是自己的捆绑,而是附着在主机上。扩展束是一种特殊类型的片段,只能附加到系统包,以便提供Framework的可选部分。可以使用此机制创建一个空扩展,只需声明所需的包,将加载保留到其托管包(在本例中为Framework)。我没有采用这条路线,因为第二种选择更快实施。
解决方案B:引导委派
我最后选择的选项是启动委派。这允许用户创建始终由框架父类加载器加载的“隐含”包,即使这些包不提供正确的导入。我通过将系统包设置为包括com.sun.management来实现。
请参阅以下优秀link,其中详细介绍了整个问题。
答案 1 :(得分:1)
您是否可以尝试在交互式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 (这可能是你问题的症结所在,我没有确切的答案,除了在OSGi包中转换传统jar,如wrap protocol或extension of an OSGi framework):
osgi> install file:bundles/SecondBundle-1.0.0.jar
Bundle id is 2