Java OSGI捆绑包的命令行参数和JVM参数

Java OSGI捆绑包的命令行参数和JVM参数,java,osgi,Java,Osgi,我正在将核心java应用程序转换为OSGI捆绑包。我搜索了很多,但在应用程序转换为bundle时,找不到实现以下目标的标准或最佳方法 如何读取OSGI捆绑包中的命令行参数(当前应用程序是从传递参数的脚本调用的,该参数是在属于jar文件的一个类的主函数中读取的) 在非OSGI部署中,我们使用-X选项微调了JVM的GC参数。在OSGI方面,如何实现同样的目标?。当我将当前应用程序拆分为捆绑包时,我需要对不同的捆绑包进行不同的GC调优。这是怎么做到的 在代码中,许多地方使用Sytem.getPrope

我正在将核心java应用程序转换为OSGI捆绑包。我搜索了很多,但在应用程序转换为bundle时,找不到实现以下目标的标准或最佳方法

  • 如何读取OSGI捆绑包中的命令行参数(当前应用程序是从传递参数的脚本调用的,该参数是在属于jar文件的一个类的主函数中读取的)

  • 在非OSGI部署中,我们使用-X选项微调了JVM的GC参数。在OSGI方面,如何实现同样的目标?。当我将当前应用程序拆分为捆绑包时,我需要对不同的捆绑包进行不同的GC调优。这是怎么做到的

  • 在代码中,许多地方使用Sytem.getProperty读取在-D选项中传递的参数。如何在OSGI中实现这一点

  • 如果有人能指导我该如何进行,那将是非常有帮助的

    谢谢
    JK

    1:我认为没有办法读取命令行参数。您应该使用“-Dxxx”将参数指定为系统属性,因为它们可以在捆绑包的代码中读取

    2:OSGi在一个JVM上运行。JVM可以用“-X”属性参数化。不能为每个捆绑指定这些属性。不能为单独的捆绑包指定不同的GC设置,因为不能为程序的不同部分定义不同的GC设置。如果你想做这样的事情,你的程序必须非常非常特别(而且“真的”还要特别十次:)。你来这里的动机是什么

    3:您可以用相同的方式获取系统属性:system.getProperty(…)

    bnd(工具)对此有标准支持。它将使用启动器的参数注册一个对象服务,作为
    launcher.arguments
    argument服务属性。以下代码演示了其用法:

    @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")
      }
    
    }
    
    @组件
    公共类ShowArgs{
    字符串[]args;
    @激活
    void start(){System.out.println(Arrays.toString(args);}
    @参考文献
    void setDone(对象完成,映射){
    this.args=(String[])map.get(“launcher.arguments”)
    }
    }
    

    bnd(工具)还可以将OSGi框架转换为可执行的jar。您可以转换任何bndrun文件(包含关于框架、运行包等的信息)通过bndtools中的Run窗格或通过
    bnd-package x.bndrun
    命令将应用程序部署为单个JAR文件,其中一个类作为入口点(比如Start.java)。从单个JAR中有4个不同的组件(JVM)将根据从脚本传递到Start.java的命令行参数启动。这些组件中的每个组件都有不同的GC设置(当前在脚本中进行处理。脚本在调用Start.java时根据启动的组件传递GC设置和-D参数).示例:如果A然后使用-XParallelGc调用Start.java;如果B然后使用其他GC等调用。现在计划将这些组件拆分为4个捆绑包。关于第1点和第3点,请您对如何实现它(即传递和读取-D参数)给出更多解释,目前我只做捆绑包:Start()所以我不知道如何传递参数。问题是,如何启动OSGi容器。例如:“java-Dxxx=yyy-jar equinox.OSGi.jar”。在这种情况下,您可以在任何地方(即使您在捆绑包类中)System.getProperty(“xxx”)执行此操作。可能您误解了OSGi。在OSGi的情况下,每个捆绑包都在同一个JVM下运行。如果您想要不同的JVM,OSGi可能不是您问题的答案。我使用karaf,到目前为止,我只使用bin dir的./karaf。。感谢关于GC的指针。在这种情况下,这是一个与karaf相关的问题,即如何设置系统属性。就像在Tomcat中,您可以使用c一组特殊的环境变量,我想卡拉夫也有一些选择。似曾相识:)