代码之家  ›  专栏  ›  技术社区  ›  Paul Whelan

com.sun.management.operatingSystemXBean在OSGi捆绑包中的使用

  •  1
  • Paul Whelan  · 技术社区  · 14 年前

    我有一些用于监视我的应用程序CPU、内存等的遗留代码,我想将它们转换成一个包。现在当我开始这个包的时候它在抱怨

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

    我使用了operatingsystemxbean来访问jvm上的统计信息。

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   VonC    14 年前

    你能试着在一个交互式的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
    
        2
  •  2
  •   Paul Whelan    14 年前

    以下是我必须做的,以使这项工作。

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

    从bundle 0命令的系统包来看,这是显而易见的,因为bundle 0始终是对我来说是新的系统包。

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

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

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

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

    解决方案A”:扩展包

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

    解决方案B:启动委派

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

    请看下面的精彩 link 这更详细地描述了整个问题。