我有一个作为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启动器会执行一些命令行验证,并且仅接受bundle缓存目录作为参数。不止一个参数,启动器退出。
您可能会使用系统属性在命令行中传递信息,我认为它不仅适用于felix,而且适用于其他osgi容器,但可能会使您的应用程序不太用户友好。
我知道您仅搜索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>