1. 程式人生 > >Eclipse OSGi被嵌入到tomcat後的console除錯方法

Eclipse OSGi被嵌入到tomcat後的console除錯方法

使用過eclipse OSGi開發過的同學都知道,OSGi有一個控制檯,可以互動式執行命令,對OSGi的bundle除錯非常有幫助。
如果你還不明白上面那句話,你可以參考IBM Developer workers上的這邊介紹OSGi的文章: Explore Eclipse’s OSGi console

上面“ Explore Eclipse’s OSGi console” 文章中舉例的是通過Eclipse IDE的console進入OSGi的console,這個是因為OSGi預設的console是System.in。
但是在實際專案執行中,你會將System.in重定向到檔案,或者你使用的第三方框架給你重定向了System.in(除非是需要通過CLI與互動的專案),這時候該如何在OSGi的console上做除錯呢?

我們以基於OSGi的RAP(Rich Ajax Platform)開發為例子,如果RAP程式執行在tomcat容器中,那麼System.in就是被tomcat重定向到了catalina.out檔案,這時候你是無法通過OSGi的console來除錯的。

這個問題的解決方法就是啟用OSGi的遠端console除錯,OSGi支援console監聽一個埠,外部使用者可以通過telnet到這個埠,登入到控制檯。
在RAP+Tomcat的場景下,OSGi的引數檔案在 ${你專案tomcat目錄}/webapps/${你的app名稱}/WEB-INF/web.xml,我們修改其中一個引數
[code lang=”xml”]

<servlet-class>org.eclipse.equinox.servletbridge.BridgeServlet </servlet-class>
<init-param>
<param-name>commandline</param-name>
<strong><param-value>-console 54321</param-value></strong>
</init-param>
<init-param>
<param-name>enableFrameworkControls</param-name>
<param-value>true</param-value>
</init-param>

[/code]

注意到上面的-console 54321,這裡給-console加了一個數字,意思就是告訴console監聽54321這個埠。然後,我們telnet上去就可以執行OSGi命令了。
如果沒有54321,僅僅是-console,那麼console就將System.in作為輸入。

最後要注意的是,這個方法對開發除錯階段很有用,但是在專案正式釋出中一定要刪除,因為這個埠是無任何許可權管理,任何人知道你的IP地址和埠都可以登入到你的OSGi後臺。後果可想而知。