[英]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.