首页 文章

如何查看Apache Felix Log中未满足捆绑要求的原因?

提问于
浏览
0

我在嵌入模式下使用Felix,使用File Install软件包,并且有一个已安装但未解决的软件包(因此不是正在启动/活动),而且我比我想的更难以找到根本原因在日志中......

如何/在哪里获得那些有用的看起来“无法解决...因为...”或“BundleException:捆绑中未解决的约束...无法解决...缺少要求... osgi.wiring.package”类日志中的消息,自动来自Felix框架和/或文件安装包?我没有看到类似的东西 - 我应该吗?哪里?

我还添加了日志记录(通过Apache Felix Logosgi-loglistener-slf4j),但仍然是nada - 你需要做的比我在(嵌入式)Felix中为这种问题启用日志记录做的更多吗?

我随后添加了Felix Gogo Shell CLI,发现它的 inspect 命令也不是很有用(对于未解析的bundle不起作用),只有 start 会显示根本原因 - 但我怎么能得到这是为了记录,而不必拥有一个控制台并开始:

g! lb  
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (5.6.1)|5.6.1
    1|Active     |    1|Apache Felix File Install (3.5.4)|3.5.4
    2|Active     |    1|Apache Felix Remote Shell (1.1.2)|1.1.2
    3|Active     |    1|Apache Felix Gogo Runtime (0.16.2)|0.16.2
    4|Active     |    1|Apache Felix Gogo Command (0.16.0)|0.16.0
    5|Active     |    1|Apache Felix Gogo Shell (0.12.0)|0.12.0
    6|Installed  |    1|osgi.testplugin (1.0.0.SNAPSHOT)|1.0.0.SNAPSHOT
g! inspect req * 6
Bundle 6 is not resolved.
g! start 6
org.osgi.framework.BundleException: Unable to resolve ch.vorburger.minecraft.osgi.testplugin [8](R 8.0): missing requirement [ch.vorburger.minecraft.osgi.testplugin [8](R 8.0)] osgi.wiring.package; (osgi.wiring.package=org.spongepowered.api.command) Unresolved requirements: [[ch.vorburger.minecraft.osgi.testplugin [8](R 8.0)] osgi.wiring.package; (osgi.wiring.package=org.spongepowered.api.command)]

我明白由于OSGi的异步捆绑初始化,可能不明白何时记录失败的捆绑启动,因为它可能需要等待依赖捆绑包出现?难道它还没有..在某种宽限期后记录这种错误?

2 回答

  • 0

    在我找到pax考试选项来检查所有捆绑包是否已解决之前,我在测试中遇到了类似的问题 .

    我所做的是以编程方式浏览bundle列表,并在每个未启动的bundle上调用start . bundle.start()然后抛出一个异常,原因就像上面的console命令一样 .

    不确定felix是否可以设置为默认情况下也记录此项 .

  • 1

    不确定这是最好的解决方案,但它帮助了我

    import org.osgi.framework.*;
    
    public class Activator implements BundleActivator, BundleListener {
    
        public void start(BundleContext context) {
            context.addBundleListener(this);
        }
    
        public void stop(BundleContext context) {
            context.removeBundleListener(this);
        }
    
        @Override
        public void bundleChanged(BundleEvent bundleEvent) {
            if (bundleEvent.getType() == BundleEvent.UNRESOLVED) {
                System.out.println("BUNDLE " + bundleEvent.getOrigin().getSymbolicName() + " UNRESOLVED");
            try{
                System.out.println("TRYING TO START " + bundleEvent.getOrigin().getSymbolicName() + " BUNDLE");
                bundleEvent.getOrigin().start();
    
            } catch (BundleException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    }

    并将activator配置添加到.bnd文件

    Bundle-ClassPath: .
    Bundle-Activator: com.netcracker.webportal.framework.activator.Activator
    Import-Package: org.osgi.framework
    

相关问题