【问题标题】:how to restart java application, remembering its command line arguments如何重新启动 java 应用程序,记住它的命令行参数
【发布时间】:2011-04-20 18:41:33
【问题描述】:

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

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

【问题讨论】:

    标签: java restart


    【解决方案1】:

    无论如何,您必须坚持命令行参数。如果参数集相当固定,请考虑编写一个小批量或 shell 脚本文件,该文件除了使用这组参数调用 java 之外什么都不做。

    如果您只想使用参数启动它一次,然后,如果您在没有参数的情况下重新启动应用程序,希望它使用上一次调用中的参数,请执行以下操作:

    public static void main(String[] args) {
    
       if (args.length == 0)
         args = readArgsFromFile();
       else
         writeArgsToFile();
    
       // ...
    
    }
    

    旁注:为简单起见,我重用了args。为了更好的代码,如果需要,将接收或存储的参数复制到另一个数据结构、另一个数组、一个 Properties 实例,...

    【讨论】:

      【解决方案2】:

      调用新的使用

      java -jar appname.jar arg1 arg2  
      

      使用

      关闭当前的
      System.exit(0);   
      

      在这里你不会遇到保留arg的问题

      Here 是从 java 应用程序调用命令的示例

      【讨论】:

        【解决方案3】:

        使用 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();
                }
            }
        }
        

        【讨论】:

        • 谢谢。 RuntimeMXBean.getInputArguments() - 不获取传递给 main 方法的命令行参数。我打印传递给命令行的属性等。
        • @StackTrace 我添加了两行来完成,我以为已经很清楚如何获取它们了。类路径和 VM 参数并不那么容易获得。
        • 用 java com.JMXTest -arg1 -arg2=val2 mx.getInputArguments() 测试:这将返回空列表。 javadoc 说 -- * 返回传递给 Java 虚拟机的输入参数 * 不包括 main 方法的参数。
        • for ( int i = 0 ; i
        【解决方案4】:

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

        您需要在"CommandLineParams" 类中实现Serializable 接口才能执行此操作。

        我认为这是完成您正在尝试做的事情的最结构化的方式。

        【讨论】:

          【解决方案5】:

          根据用户的操作系统不同,如果你真的想做操作系统跨平台兼容。然后你应该提供启动脚本:Linux 的 shell,如 OS / Windows 的 bat,这些脚本设置类路径和参数。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-25
            • 2011-04-04
            • 2015-02-24
            • 2021-04-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多