我正在努力将核心Java应用程序转换为OSGI包。我搜索了很多但是在将应用程序转换为bundle时无法找到完成以下内容的标准或最佳方法。
如何读取OSGI包中的命令行参数(目前,应用程序是从一个脚本调用的,该脚本传递的参数是在作为jar文件一部分的类之一的main函数内读取的)
在非OSGI部署中,我们使用-X选项对JVM的GC参数进行了微调。如何在OSGI中实现同样的目标?当我将当前应用程序拆分为捆绑包时,我需要对不同的捆绑包进行不同的GC调整。怎么做?
在代码中,很多地方Sytem.getProperty用于读取在-D选项中传递的参数。如何在OSGI中完成。
如果有人能指导我如何继续,将会有很大的帮助。
由于 JK
答案 0 :(得分:1)
bnd(tools)对此有标准支持。它将使用启动器的参数注册Object服务作为参数服务属性的launcher.arguments
。以下代码演示了它的用法:
@Component
public class ShowArgs {
String[] args;
@Activate
void start() { System.out.println(Arrays.toString(args); }
@Reference
void setDone( Object done, Map<String,Object> map) {
this.args = (String[]) map.get("launcher.arguments")
}
}
bnd(tools)也很适合将OSGi框架变成可执行jar。您可以将任何bndrun文件(包含有关框架,运行包等的信息)转换为可执行的JAR。通过bndtools中的“运行”窗格或通过bnd package x.bndrun
命令。
答案 1 :(得分:0)
1:我认为没有办法读取命令行参数。您应该使用“-Dxxx”将参数指定为系统属性,因为它们可以在包的代码中读取
2:OSGi在一个JVM上运行。 JVM可以使用“-X”属性进行参数化。您不能为每个包指定这些属性。您无法为单独的捆绑包指定不同的GC设置,因为您无法为程序的不同部分定义不同的GC设置。如果你想做这样的事情,你的程序必须真的,真的(并且“真的”大约十次以上:))特别。你的动机是什么?
3:您可以以相同的方式获取系统属性:System.getProperty(...)