【问题标题】:com.sun.management.OperatingSystemMXBean use in an OSGi bundlecom.sun.management.OperatingSystemMXBean 在 OSGi 包中的使用
【发布时间】:2010-04-13 13:56:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java monitoring osgi equinox apache-felix


    【解决方案1】:

    以下是我必须执行的操作。

    我必须将 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 默认不包含系统属性中的 com.sun 包的原因请参阅here。 (直接调用 sun.* 包的 Java 程序不能保证在所有 Java 兼容的平台上都能工作。事实上,即使在同一平台上的未来版本中,这样的程序也不能保证工作。)

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

    解决方案 A':扩展包

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

    解决方案 B:引导委派

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

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

    【讨论】:

    • +1。感谢您提供这个非常有趣的反馈。您能否详细说明解决方案 B(为了不依赖可能有一天会中断的互联网链接)?
    【解决方案2】:

    您可以尝试在交互式 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 protocolextension of an OSGi framework):

    osgi> install file:bundles/SecondBundle-1.0.0.jar
    Bundle id is 2
    

    【讨论】:

    • 感谢 VonC 是的,抱歉,我正在尝试解决依赖问题。该包位于 rt.jar 中,它是 jre lib 的一部分,所以我对包装它持谨慎态度,但我会试一试并在这里报告。
    • @Paul:也许这个线程也可以提供帮助,在包装 rt.jar 之前:mail-archive.com/osgi-dev@mail.osgi.org/msg00518.html
    • 非常感谢链接为我指明了正确的方向 我在下面添加了有关默认情况下不包含 com.sun 包的原因的详细信息。
    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 2012-11-06
    • 2016-01-01
    • 1970-01-01
    • 2012-06-30
    • 2013-08-20
    • 2019-02-09
    • 2010-11-25
    相关资源
    最近更新 更多