2016-12-12 22 views
0

我在嵌入式模式下使用Felix,使用File Install軟件包,並且有一個安裝但未解決(因此無法啓動/活動)的軟件包,而且我掙扎的時間比我想的要多根本原因在日誌中...如何看到爲什麼在Apache Felix Log中不滿足捆綁需求?

如何/你在哪裏得到那些有用的尋找「無法解決...因爲...」或「BundleException:束中未解決的約束...無法解決...缺少需求... osgi.wiring.package「日誌中的消息類型,是否自動從Felix框架和/或文件安裝捆綁包中?我沒有看到類似的東西 - 我應該嗎?哪裏?

我還添加了日誌記錄(通過Apache Felix Logosgi-loglistener-slf4j),但仍然是虛擬現實 - 您需要做的比我在嵌入式Felix中爲這類問題啓用日誌記錄功能做得更多嗎?

我已經添加了Felix Gogo Shell CLI,並且發現它的inspect命令也不是很有幫助(對未解析的捆綁包不起作用),並且只有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的異步包初始化,它可能不是很明顯,當登錄失敗的包開始,因爲它可能必須等待依賴捆綁才能出現?難道它仍然..在某種寬限期之後記錄這種錯誤?

回答

1

我在測試中發現了一個類似的問題,然後找到pax檢查選項來檢查所有捆綁包是否已解決。

我所做的是以編程方式瀏覽捆綁軟件列表,並在未啓動的每個捆綁軟件上調用start。 bundle.start()然後拋出一個例外與上面的控制檯命令一樣的原因。

不知道是否felix可以設置爲默認情況下也記錄這個。

+0

右..所以是這裏的問題,然後真的不是Felix Framework核心,但是文件安裝捆綁軟件從bundle.start()中「吞併」了它的異常,或者當它注意到它所監視的目錄中的變化時呢?這是一個公平的錯誤報告,也許是一個LOG錯誤()或警告()的貢獻是合理的嗎?或者它可能是故意吞下的 - 當文件安裝應該忽略沒有記錄的包啓動錯誤(可能是因爲它會重試,所以'污染'日誌不會是可取的)時可以想象的情景嗎? – vorburger

+0

絕對值得在felix上打開一個問題。也許fileinstall可以配置爲顯示錯誤,但也可能是一個錯誤。 –

+0

好的,打開https://issues.apache.org/jira/browse/FELIX-5448 ... – vorburger

0

不知道這是最好的解決辦法,但它幫助我

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(); 
     } 

    } 
} 

}

,並添加催化劑配置到.BND文件

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