从OSGi捆绑包访问命令行参数

问题描述 投票:7回答:4

我有一个作为OSGi捆绑软件集合运行的应用程序。我使用嵌入Felix框架的非常小的包装程序开始它。那个包装器的必要性让我有些不适,因为它依赖于Felix(而应用程序本身也可以在Equinox中运行得很好),所以我想摆脱它,并使用默认的Felix启动器。

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

是否有一种标准方法(或至少是Felix标准方法)来从捆绑软件访问命令行参数,以便我可以取消自定义启动器?

java command-line osgi apache-felix
4个回答
8
投票

如果使用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

2
投票

最新答案,但也许有人觉得它有用。

我遇到了同样的问题。我的应用程序在OSGi中运行,但是我需要遵循一些外部接口,这意味着必须读取命令行参数。

关键是在新的OSGi规范4.2中定义的东西,即框架启动。您可以在“生命周期层”部分的“草稿规范”(可在www.osgi.org的“草稿”下找到)中阅读有关它的内容。

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

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

从Equinox 3.5M6(我认为,至少是M6)开始,对此提供支持。最新版本的Apache Felix也支持此功能。


1
投票

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

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


1
投票

我知道您仅搜索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>
© www.soinside.com 2019 - 2024. All rights reserved.