1

在我的 Swing 应用程序中是一个通过 setx 设置一些环境变量的按钮。我必须重新启动应用程序才能激活变量。

要重新启动应用程序,我使用来自https://dzone.com/articles/programmatically-restart-java的代码

它工作正常,但未设置变量。

当我手动重新启动应用程序时,会设置变量。

这是上面链接中的代码:

/** 
 * Sun property pointing the main class and its arguments. 
 * Might not be defined on non Hotspot VM implementations.
 */
public static final String SUN_JAVA_COMMAND = "sun.java.command";

/**
 * Restart the current Java application
 * @param runBeforeRestart some custom code to be run before restarting
 * @throws IOException
 */
public static void restartApplication(Runnable runBeforeRestart) throws IOException{
    try{
        // java binary
        String java = System.getProperty("java.home") + "/bin/java";
        // vm arguments
        List<String> vmArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
        StringBuffer vmArgsOneLine = new StringBuffer();

        for (String arg : vmArguments){
            // if it's the agent argument : we ignore it otherwise the
            // address of the old application and the new one will be in conflict
            if (!arg.contains("-agentlib")){
                vmArgsOneLine.append(arg);
                vmArgsOneLine.append(" ");
            }
        }

        // init the command to execute, add the vm args
        final StringBuffer cmd = new StringBuffer("\"" + java + "\" " + vmArgsOneLine);

        // program main and program arguments
        String[] mainCommand = System.getProperty(SUN_JAVA_COMMAND).split(" ");

        // program main is a jar
        if (mainCommand[0].endsWith(".jar")){
            // if it's a jar, add -jar mainJar
            cmd.append("-jar " + new File(mainCommand[0]).getPath());
        }else{
            // else it's a .class, add the classpath and mainClass
            cmd.append("-cp \"" + System.getProperty("java.class.path") + "\" " + mainCommand[0]);
        }

        // finally add program arguments
        for (int i = 1; i < mainCommand.length; i++){
            cmd.append(" ");
            cmd.append(mainCommand[i]);
        }

        // execute the command in a shutdown hook, to be sure that all the
        // resources have been disposed before restarting the application
        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run(){
                try{
                    Runtime.getRuntime().exec(cmd.toString());
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        });

        // execute some custom code before restarting
        if (runBeforeRestart != null){
            runBeforeRestart.run();
        }

        // exit
        System.exit(0);
    }catch(Exception e){
        // something went wrong
        throw new IOException("Error while trying to restart the application", e);
    }
}
4

1 回答 1

1

现在我使用了 Apache exec,它似乎可以工作。

Executor exec = new DefaultExecutor();
CommandLine cl = CommandLine.parse(command);
Map<String, String> env = EnvironmentUtils.getProcEnvironment();
env.put("XYZ", "XYZ"); //own vars
exec.execute(cl, env);
于 2015-07-14T11:31:09.087 回答