如何重新启动java应用程序,记住其命令行参数

如何重新启动java应用程序,记住其命令行参数,java,restart,Java,Restart,我有一个java应用程序。它可以通过几个命令行标志启动。我想提供用户“重启”应用程序的能力 目前,我们将参数保存在一个控制文件中,在重新启动应用程序时读取它。重启应用程序的最佳方式是什么?如何保留命令行参数 使用 java -jar appname.jar arg1 arg2 关闭当前的一个使用 System.exit(0); 在这里,您将不会面临保留arg的问题 例如,要从java app调用命令,您必须保留命令行参数。如果参数集是固定的,考虑编写一个小批量或shell脚本文件,

我有一个java应用程序。它可以通过几个命令行标志启动。我想提供用户“重启”应用程序的能力

目前,我们将参数保存在一个控制文件中,在重新启动应用程序时读取它。重启应用程序的最佳方式是什么?如何保留命令行参数

使用

java -jar appname.jar arg1 arg2  
关闭当前的一个使用

System.exit(0);   
在这里,您将不会面临保留arg的问题


例如,要从java app调用命令,您必须保留命令行参数。如果参数集是固定的,考虑编写一个小批量或shell脚本文件,它只调用带有这组参数的java。 如果只想用参数启动一次,然后在没有参数的情况下重新启动应用程序,想让它使用上一次调用中的参数,请执行以下操作:

public static void main(String[] args) {

   if (args.length == 0)
     args = readArgsFromFile();
   else
     writeArgsToFile();

   // ...

}

旁注:为了简单起见,我重用了
args
。为了获得更好的代码,如果需要,可以使用您可以检索的RuntimeMXBean、Classpath、Bootclasspath等将接收到的或存储的参数复制到另一个数据结构、另一个数组、属性实例等

package com;

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;

class JMXTest {
    public static void main(String args[]) {
        try {
            for ( int i = 0 ; i < args.length ; i++ ) 
                 System.out.println( "args   :" + args[i] );

            RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
            System.out.println( "boot  CP:" + mx.getBootClassPath() );
            System.out.println( "      CP:" + mx.getClassPath() );
            System.out.println( "cmd args:" + mx.getInputArguments() );
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
    }
}
package-com;
导入java.lang.management.ManagementFactory;
导入java.lang.management.RuntimeMXBean;
类JMXTest{
公共静态void main(字符串参数[]){
试一试{
对于(int i=0;i
如果您真的想实现操作系统的跨平台兼容,它会根据用户的操作系统而有所不同。然后您应该提供启动脚本:shell for linux,比如OS/bat for windows,这些脚本设置类路径和参数


我不认为在应用程序中创建“重启”按钮是一个明智的决定,但是如果您想要像“eclipse重启”这样的东西,您应该看看RuntimeMXBean,它可以为您获得引导类路径

为什么不重新启动时从磁盘序列化并再次创建对象

您需要在
“CommandLineParams”
类中实现可序列化的
接口来完成此操作


我认为这是完成你想做的事情最有条理的方式。

谢谢。RuntimeMXBean.getInputArguments()-不获取传递给main方法的命令行参数。我打印了传递给命令行的属性等。@StackTrace我添加了两行来完成,我认为如何获取它们已经很清楚了。Classpath和VM参数不太容易获取。使用java com.JMXTest-arg1-arg2=val2 mx.getInputArguments()进行测试:返回空列表。javadoc说--*返回传递给Java虚拟机*的输入参数,其中不包括main方法.for(int i=0;i