[英]How to write an OSGI command-line application
我目前正在嘗試使用OSGI,並決定選擇一個稍微不典型的OSGI用例。 我想在命令行應用程序中使用它。 我想要一個main(..)
方法,它接受一些標志和參數,做一些事情並再次關閉。 我不想要的是啟動Apache Karaf(或類似的)並在OSGI控制台中運行命令(這可能成為一個可選功能)。
為什么OSGI首先用於命令行應用程序? 該應用程序應該使用相同庫的不同版本(即彈性搜索 )。 而且僅僅因為它當然是壞事。
我應該在捆綁中還是在外面消費服務? 如何做到這一點? 可能會出現什么問題?
使用bnd時,有一種非常簡單的方法來編寫命令行應用程序。 bnd具有使用package命令創建可執行jar的功能:
$ bnd run xyz.bnd
.... whatever your app does
$ bnd package xyz.bnd
$ ls
xyz.jar xyz.bnd .....
$ java -jar xyz.jar ...
.... whatever your app does
請注意,此jar已完成,它包含所有bundle,框架,啟動程序以及運行它的屬性。 沒有外部依賴。
訣竅是獲取主線程(其中調用靜態main)。 您唯一需要做的就是使用屬性main.thread=true
注冊Runnable服務。 然后啟動器將在此服務上調用run()然后退出(只要您願意,您就可以繼續運行)。
要獲取命令行參數,可以使用launcher.arguments
屬性獲取Object服務。 此屬性將具有您的命令參數。 或者使用DS組件執行此操作:
@Component(immediate=true, property="main.thread=true")
public class Main implements Runnable {
String[] args;
public void run(){ ... }
@Reference(target="(launcher.arguments=*)")
void setArgs(Object service, Map<String,Object> props) {
this.args = (String[]) props.get("launcher.arguments");
}
}
執行此操作的最佳方法是使用bndtools,因為它可以輕松地測試/調試代碼。 您可能想要使用bndrun文件。
PS在最新的bnd中,您可以使用Callable <Integer>而不是Runnable。 然后返回值是進程的退出代碼。 然而,這可能還沒有出現在bndtools中。
回答我自己的問題( Q&A風格 ):我目前認為最好
org.osgi.framework.system.packages.extra
) 在所有捆綁包啟動后,可以安全地假設所需的服務可用。 這也避免了將配置傳遞到OSGI中,而OSGI實際上只是服務調用的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.