繁体   English   中英

从 OSGi 包访问命令行参数

[英]accessing command-line arguments from OSGi bundle

我有一个作为 OSGi 包集合运行的应用程序。 我使用一个嵌入 Felix 框架的非常小的包装器来启动它。 这个包装器的必要性让我有点恼火,因为它依赖于 Felix(而应用程序本身也可以在 Equinox 中运行),所以我想摆脱它,并使用默认的 Felix发射器。

包装器真正做的唯一一件事就是将命令行参数传递到启动的 OSGi 框架中,以便那里的包可以对它们做出反应。 请注意,它实际上并不解析参数,只是将 String[] 推送到我的应用程序中。

是否有标准方式(或至少是 Felix 标准方式)来访问捆绑包中的命令行参数,以便我可以取消自定义启动器?

如果你使用 bnd(tools) 你可以使用它的启动器。 它将命令行参数注册为服务属性“launcher.arguments”。

当您将它与 bnd package 命令结合使用时,这非常有效。 这个命令需要一个 bnd 项目或一个描述运行环境(包、属性、框架)的 bndrun 文件,并变成一个独立的主 jar。 因此,您在 bndtools 中进行开发和调试,当您感到满意时,您可以将其转换为单个可执行 jar。 例子:

@Component
public class MyApp {
   String[] args;

   @Activate
   void activate() { 
      System.out.println("Args: " + Arrays.toString(args));
   }

   @Reference(target="(launcher.arguments=*)")
   void args( Object object, Map<String,Object> map) {
       args = (String[]) map.get("launcher.arguments");
   }
}

变成可执行文件:

bnd package myapp.bnd
java -jar myapp.jar -a somearg *.file

迟到的答案,但也许有人觉得它有用。

我遇到了完全相同的问题。 我的应用程序在 OSGi 中运行,但我有需要遵守的外部接口,这意味着读取命令行参数。

关键是在新的 OSGi 规范 4.2 中定义的东西,即框架启动。 您可以在生命周期层部分的草案规范(在 www.osgi.org 上的草案下找到)中了解它。

这是从独立 Java 应用程序启动 OSGi 框架(任何支持 OSGi 4.2 的实现)的标准方式。 有趣的是,只要在 CLASSPATH 中找到它,您就不需要知道您启动的是哪个实现(Felix、Equinox 等)。

这样,您的启动器应用程序读取命令行参数,实例化并启动 OSGi 框架并将参数传递给您的包(任何您想要的方式)。 您在启动器应用程序中获得的是框架的上下文,您可以从中与您的包进行通信。

从 Equinox 3.5M6(我认为,至少是 M6)开始支持。 Apache Felix 的最新版本也支持这一点。

我知道您只搜索了 Felix。 那么,这个仅限 Equinox 的解决方案可能没有用。 我把它留在这里,因为其他人可能会被这个问题绊倒并且让 Equinox 运行。

从任何捆绑包和任何框架来看,这可能很困难。 如果您使用 org.eclipse.core.runtime.applications 扩展点,应该很容易。 前提条件:您不要将 -console 作为参数传递。

public class Application implements IApplication {

    @Override
    public Object start(IApplicationContext context) throws Exception {
        String[] args = (String[])context.getArguments().get("application.args");
        // args.length == 0 if no arguments have been passed
    }
}

plugin.xml 中的引用

 <plugin>
    <extension
          id="myApp"
          point="org.eclipse.core.runtime.applications">
        <application>
          <run class="package.Application" />
        </application>  
    </extension>
 </plugin>

可能不是。 我认为标准的 Felix 启动器会进行一些命令行验证,并且只接受捆绑缓存目录作为参数。 不止一个参数,启动器退出。

您可以使用系统属性在命令行中传递信息,我认为它不仅适用于 felix,还适用于其他 osgi 容器,但它可能会使您的应用程序对用户不太友好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM