[英]Java two jvm update system, no jws or applet
我目前正在使用Java 6,但无法更新。 我无法使用Java Web Start或将此桌面应用程序转换为applet。 话虽如此,我只剩下从共享文件夹中复制新的更新的jar文件并将其粘贴到users文件夹中了。 我不是专业的编码人员,我通常使用Perl进行编码,但是在过去的6个月中一直在使用Java。 因此,您可能会看到一些问题,请随时指出。 我喜欢学习。
我已经很好地实现了两个JVM会话(我认为)。 我遇到了以下问题:
Exception in thread "main" java.lang.NoClassDefFoundError:
当新的清单版本与最初启动的清单版本不匹配时,我会收到此错误。 一旦我终止了该会话(因为该会话在该错误之后挂起)并重新启动,它便会检测到更新并正常运行。 当然,我不能让用户经历那个过程。
一旦发现版本不匹配,这就是我启动第二个JVM的方式。 我在第一个应用程序中使用它:
JOptionPane.showMessageDialog(null,
"Your version is outdated. I will try to update. Hold tight...", // Message
"Update Notice.", // Title
JOptionPane.INFORMATION_MESSAGE);
startSecondJVM();
<ClassName>.MainWindow.dispose();
System.exit(0);
好像它没有到达“ System.exit(0)”部分。 我需要实现线程化吗?
这是其调用的方法:
public static void startSecondJVM() throws Exception {
String separator = System.getProperty("file.separator");
String javapath = System.getProperty("java.home");
//String javapath = "C:\\Program Files\\Java\\jre7\\";
String fullJavaPath = javapath + "bin" + separator + "java";
System.out.println("Java Path: " + fullJavaPath);
ProcessBuilder processBuilder =
new ProcessBuilder(fullJavaPath, "-jar",
updatePath); // AnotherClassWithMainMethod.class.getName()
Process process = processBuilder.start();
process.waitFor();
}
一旦负责更新的第二个jar文件启动。 我在该文件的主要方法中拥有此功能(当然不包括其他代码):
try {
Thread.sleep(3000);
FileCopy.copyFile(FileCopy.source, dest);
} catch (IOException e) {
e.printStackTrace();
}
其使用的方法是这样的:
public static void copyFile(File sourceFile, File destFile) throws IOException {
if(!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
if(source != null) {
source.close();
}
if(destination != null) {
destination.close();
}
} catch (FileNotFoundException e ) {
e.printStackTrace();
}
} // End of copy file
因此,回顾一下。 文件复制过程似乎工作正常。 原始应用程序似乎并没有完全退出。 复制过程完成后,它将继续打开。 那就是我遇到错误的地方。 所以我的问题是,当我用第二个Java应用程序更新时,如何完全杀死第一个应用程序。
您的问题是第一个JAR中的这一行:
process.waitFor();
这将一直等到您的第二个jar完成运行后,第一个JAR才会退出-您不需要的东西(这称为死锁)。 您想开始这一过程并放手。
如果您删除此行,我相当有信心,应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.