2009-01-12 67 views
7

我有一个作为OSGi包集合运行的应用程序。我使用嵌入Felix框架的非常小的包装器启动它。这个包装器的必要性让我感到有些不舒服,因为它依赖于Felix(而应用程序本身也可以在Equinox中运行),所以我想摆脱它,并使用默认的Felix发射器。访问来自OSGi包的命令行参数

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

是否有一个标准的方式(或至少一个费利克斯标准的方式)从一个包中访问命令行参数,以便我可以取消自定义启动器?

+0

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 } } 

参考这是怎么转出?您是否最终使用了框架启动选项而不是-D JVM参数?如果是这样,willir可以发布一些关于你的解决方案的信息?谢谢。 – Chris 2010-04-22 19:35:15

回答

1

可能不是。我认为标准的Felix启动器会执行一些命令行验证,并且只接受bundle cache dir作为参数。不止一个参数和发射器退出。

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

+0

是的。 “-Disis -DandThat”似乎工作,但它确实很难看...... – Thilo 2009-01-21 08:46:04

2

迟到的答案,但也许有人认为它有用。

我有一个很相同的问题。我的应用程序在OSGi中运行,但我有外部接口,我需要遵守这意味着阅读命令行参数。

这个关键是在新的OSGi规范4.2中定义的,即Framework Launching。您可以在生命周期层部分的草稿规范中找到它(在www.osgi.org上的草案下找到)。

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

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

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

+2

我会给一些百万美元的链接洒在这个答案中 – drozzy 2011-02-19 18:03:22

7

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

当您将它与bnd软件包命令结合使用时,它的工作效果非常好。该命令需要一个bnd项目或一个描述运行环境(捆绑软件,属性,框架)的bndrun文件,并转化为一个独立的主jar文件。所以你在bndtools中开发和调试,当你感到高兴的时候,把它变成一个可执行的jar。例如:

@Component 
public class MyApp { 
    String args; 

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

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

# to turn into an executable 
bnd package myapp.bnd 
java -jar myapp.jar -a somearg *.file 
1

我知道您只搜索了Felix。然后,这个Equinox-only解决方案可能没有用处。我把它留在这里,因为别人可能会偶然发现这个问题并且运行Equinox。

从任何包和任何框架,它可能很难。如果你使用org.eclipse.core.runtime。应用程序扩展点,应该很容易。先决条件:您不要将-console作为参数传递。 plugin.xml中

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