簡體   English   中英

如何編寫OSGI命令行應用程序

[英]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風格 ):我目前認為最好

  1. 啟動OSGI嵌入式 (干凈)
  2. 啟動容器
  3. export API包( org.osgi.framework.system.packages.extra
  4. 安裝並啟動所需的捆綁包
  5. 消費OSGI之外的服務
  6. 關閉容器
  7. 退出應用程序

在所有捆綁包啟動后,可以安全地假設所需的服務可用。 這也避免了將配置傳遞到OSGI中,而OSGI實際上只是服務調用的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM