如何重新启动 Java 程序以激活环境变量
How to restart a Java program to get environment variables active
在我的 swing 应用程序中有一个按钮,用于通过 setx 设置一些环境变量。
我必须重新启动应用程序才能激活变量。
要重新启动应用程序,我使用 https://dzone.com/articles/programmatically-restart-java
中的代码
运行良好,但未设置变量。
当我手动重新启动应用程序时,变量已设置。
这是上面 link 中的代码:
/**
* 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);
在我的 swing 应用程序中有一个按钮,用于通过 setx 设置一些环境变量。 我必须重新启动应用程序才能激活变量。
要重新启动应用程序,我使用 https://dzone.com/articles/programmatically-restart-java
中的代码运行良好,但未设置变量。
当我手动重新启动应用程序时,变量已设置。
这是上面 link 中的代码:
/**
* 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);