如何重新启动Java程序以激活环境变量



在我的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);
    }
}

现在我使用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);

相关内容

  • 没有找到相关文章

最新更新