【问题标题】:How to write an OSGI command-line application如何编写 OSGI 命令行应用程序
【发布时间】:2013-07-18 13:18:29
【问题描述】:

我目前正在接触 OSGI,并决定尝试一个稍微不典型的 OSGI 用例。我想在命令行应用程序中使用它。我想要一个main(..) 方法,它接受一些标志和参数,做一些事情并再次关闭。我不想要的是启动 Apache Karaf(或类似的)并在 OSGI 控制台中运行命令(虽然这可能成为一个可选功能)。

为什么首先将 OSGI 用于命令行应用程序?该应用程序应该使用同一库的不同版本(即elasticsearch)。只是因为它当然很糟糕。

我应该在捆绑包中还是外部使用服务?如何做到这一点?会出现什么问题?

【问题讨论】:

  • 这是一个有趣的问题,如果你想让包使用 discoverable 命令行选项(这是我们的用例),那就更难了。唉,我们的最终解决方案相当重量级,我还没有时间将它提炼成其他人可以使用的东西……

标签: java osgi embedded-osgi


【解决方案1】:

当您使用 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 是完整的,它包含所有包、框架、启动器和运行它的属性。没有外部依赖。

诀窍是获取主线程(调用静态 main 的地方)。您唯一需要做的就是使用属性main.thread=true 注册一个可运行服务。然后,启动器将在此服务上调用 run() 并退出(您可以根据需要一直保持运行状态)。

要获取命令行参数,您可以使用 launcher.arguments 属性获取对象服务。此属性将包含您的命令参数。或者使用 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 文件。

附:在最新的 bnd 中,您可以使用 Callable 而不是 Runnable。然后返回值是进程的退出代码。但是,这可能还没有出现在 bndtools 中。

【讨论】:

  • 感谢您的回答。这听起来确实很容易。你知道package这个命令是否被maven-bundle-plugin暴露了吗?
  • Object.class 是什么意思?应该简单地删除它,使其成为常规设置器,对吗?
  • 我觉得应该是一个Object参数。不幸的是,您不能只删除它,即使它只是您感兴趣的 Map 参数。
  • 包命令仅在(bnd)tools中可用
【解决方案2】:

回答我自己的问题 (Q&A style):我目前认为最好是

  1. 开始OSGI embedded(干净)
  2. 启动容器
  3. 导出 API 包 (org.osgi.framework.system.packages.extra)
  4. 安装并启动所需的包
  5. consume services outside of OSGI
  6. 关闭容器
  7. 退出应用程序

启动所有捆绑包后,可以安全地假设所需的服务可用。这也避免了将配置传递给实际上只是服务调用的参数的 OSGI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多