1

我有一些遗留代码用于监控我的应用程序 cpu、内存等,我想将其转换为捆绑包。现在,当我启动这个捆绑包时,它会抱怨

Missing Constraint: Import-Package: com.sun.management; version="0.0.0"

我曾使用 OperatingSystemMXBean 来访问 JVM 上的统计信息。

我的问题是我可以在 OSGI 容器中使用这个类吗?如果可以,如何使用?或者我应该使用其他方式来监控我的应用程序。我正在从 Web 前端对应用程序进行 RMI 调用,以获取 OSGi 之前的节点性能数据。

4

2 回答 2

2

以下是我必须做的才能让这个工作。

我不得不将 com.sun.management 添加到系统包的 systemProperties 值中,因为我是 OSGI 的新手,所以我花了一段时间才弄清楚。我使用 maven-pax-plugin 所以我需要添加以下属性。默认情况下它不起作用的原因是 Equinox 我选择的 osgi 容器默认情况下不包括系统包中的 com.sun.* 包。

通过使用 bundle 0 命令查看系统捆绑包,这一点很明显,因为捆绑包 0 始终是系统捆绑包,这对我来说是新事物。

<param>--sp=com.sun.management</param>

添加此命令后,系统捆绑包包括 com.sun.management 和我的捆绑包部署没有问题。

默认情况下,Equinox 在 systemProperties 中不包含 com.sun 包的原因请参见此处。(直接调用 sun.* 包的 Java 程序不能保证在所有 Java 兼容的平台上都能工作。事实上,即使在同一平台上的未来版本中,这样的程序也不能保证工作。)

因此,您有两个选项可以将 com.sun 添加到 osgi 容器中。

解决方案 A':扩展包

这些充当片段;它们不是自己的捆绑包,而是附加到主机上。扩展包是一种特殊的片段,它只附加到系统包以提供框架的可选部分。可以使用这种机制来创建一个空扩展,它只声明所需的包,将加载留给它的托管包(在本例中为框架)。我没有选择这条路线,因为第二种选择实施起来更快。

解决方案 B:引导委派

我最终选择的选项是引导委托。这允许用户创建总是由框架父类加载器加载的“隐含”包,即使包没有提供正确的导入。我通过设置系统包来包含 com.sun.management 来实现。

请参阅以下出色的链接,该链接更详细地描述了整个问题。

于 2010-04-14T14:39:10.660 回答
1

您可以尝试在交互式 OSGi 会话中安装它吗?
例如,请参阅这篇文章

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,如包装协议OSGi 框架的扩展):

osgi> install file:bundles/SecondBundle-1.0.0.jar
Bundle id is 2
于 2010-04-13T14:13:50.750 回答