如何克服OSGi中的“缺少可选导入的包”问题

时间:2012-01-04 12:42:02

标签: maven osgi equinox osgi-fragment

我使用“maven-bundle-plugin”编写了一个OSGi包(其中我尝试将“jruby-complete-1.4.0.jar”作为osgi包,注意只有依赖是“jruby-complete-1.4”。 0.jar“)..当我使用diag命令(#diag XX)通过osgi控制台检查捆绑包时,它说有些包丢失了;

osgi> diag 51
reference:file:dropins/jruby-complete-1.4.0.wso2v1.jar [51]
  Direct constraints which are unresolved:
    Missing optionally imported package com.sun.mirror.apt_0.0.0.
    Missing optionally imported package com.sun.mirror.declaration_0.0.0.
    Missing optionally imported package com.sun.mirror.type_0.0.0.
    Missing optionally imported package com.sun.mirror.util_0.0.0.
    Missing optionally imported package org.apache.bsf.util_0.0.0.
    Missing optionally imported package org.jgrapht_0.0.0.
    Missing optionally imported package org.jgrapht.graph_0.0.0.
    Missing optionally imported package sun.misc_0.0.0.

我的pom就像;

<plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>

                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <Export-Package>
                            com.kenai.*,
                            com.sun.jna.*,
                            org.jruby.*,
                            org.joni.*,                            
                        </Export-Package>
                        <Import-Package>                
                        *;resolution:=optional
                        </Import-Package>
                        <Fragment-Host>bsf-all</Fragment-Host>
            <DynamicImport-Package>*</DynamicImport-Package>    
            <Embed-Dependency>*;scope=compile|runtime;inline=true;</Embed-Dependency>       
                    </instructions>
                </configuration>
            </plugin>

所以,我尝试在<Import-Package>选项中添加那些“可选的缺失包”,如pom [2] 但它提供了更多的问题,如;

ference:file:dropins/jruby-complete-1.4.0.wso2v1.jar [51]
Constraints from the fragment conflict with the host: Import-Package: *; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: com.sun.mirror.apt; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: com.sun.mirror.declaration; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: com.sun.mirror.type; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: com.sun.mirror.util; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: javax.management; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: javax.script; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: javax.swing.plaf.basic; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: org.apache.bsf; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: org.apache.bsf.util; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: org.jgrapht; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: org.jgrapht.graph; version="0.0.0"
Constraints from the fragment conflict with the host: Import-Package: org.jruby.anno; version="[1.4.0,2.0.0)"
Constraints from the fragment conflict with the host: Import-Package: org.jruby.exceptions; version="[1.4.0,2.0.0)"
Constraints from the fragment conflict with the host: Import-Package: org.jruby.runtime; version="[1.4.0,2.0.0)"
Constraints from the fragment conflict with the host: Import-Package: org.jruby.runtime.builtin; version="[1.4.0,2.0.0)"
Constraints from the fragment conflict with the host: Import-Package: sun.misc; version="0.0.0"
Direct constraints which are unresolved:
  Missing imported package com.sun.mirror.apt_0.0.0.
  Missing imported package com.sun.mirror.declaration_0.0.0.
  Missing imported package com.sun.mirror.type_0.0.0.
  Missing imported package com.sun.mirror.util_0.0.0.
  Missing imported package org.apache.bsf.util_0.0.0.
  Missing imported package org.jgrapht_0.0.0.
  Missing imported package org.jgrapht.graph_0.0.0.
  Missing optionally imported package org.jruby.anno_[1.4.0,2.0.0).
  Missing optionally imported package org.jruby.exceptions_[1.4.0,2.0.0).
  Missing optionally imported package org.jruby.runtime_[1.4.0,2.0.0).
  Missing optionally imported package org.jruby.runtime.builtin_[1.4.0,2.0.0).
  Missing imported package sun.misc_0.0.0.  

pom.xml [2];

 <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>

                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <Export-Package>
                            com.kenai.*,
                            com.sun.jna.*,
                            org.jruby.*,
                            org.joni.*,                            
                        </Export-Package>
                        <Import-Package>                
                        com.sun.mirror.apt.*,
                        com.sun.mirror.declaration.*,
                        com.sun.mirror.type.*,
                        com.sun.mirror.util.*,
                        org.apache.bsf.util.*,
                        org.jgrapht.*,
                        org.jgrapht.graph.*,
                        sun.misc.*,
                          *;resolution:=optional
                        </Import-Package>
                        <Fragment-Host>bsf-all</Fragment-Host>
            <DynamicImport-Package>*</DynamicImport-Package>    
            <Embed-Dependency>*;scope=compile|runtime;inline=true;</Embed-Dependency>       
                    </instructions>
                </configuration>
            </plugin>

我如何克服上述问题? 我正在出口一些包,我需要其他包...我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

这些包是可选导入,因此这里不一定有任何问题。

海报修改后的问题

更新

bundle插件通过检查bundle中的字节码发现了这些依赖关系。它们通常是必需的依赖项,但由于某种原因,您通过添加<Import-Package>*;resolution:=optional</Import-Package>使它们成为可选项。不知道为什么你这样做但从不介意...

解决包的正确方法是找到导出它们的包。例如,您的捆绑包需要包org.jgrapht。因此,您需要安装导出该包的包。

一个例外是sun.misc包,它显然来自JRE,但一般不应该使用。 OSGi框架默认情况下不提供此软件包,但您可以通过添加以下设置来配置它们:

org.osgi.framework.system.packages.extra=sun.misc

放置此设置的确切文件或位置取决于您的OSGi框架 - 您尚未指定您使用的是哪一个,所以不管它是什么,请查看其文档,了解如何传递配置设置。