我目前正在使用Java 6,我无法更新。我无法使用Java Web Start或将此桌面应用程序转换为applet。话虽如此,我还是从共享文件夹中复制新的更新的jar文件并将其粘贴到users文件夹中。我不是一个专业的程序员,我在Perl中编写代码,但在过去的6个月里,我一直在使用Java。所以你可能会看到一些问题,请随时指出它们。我喜欢学习。
我已经实现了两个JVM会话(我认为)。我遇到了以下问题:
Exception in thread "main" java.lang.NoClassDefFoundError:
当新的Manifest版本与最初启动的Manifest版本不匹配时,我收到此错误。一旦我终止会话(因为它在该错误之后挂起),并重新启动,它确实检测到更新并运行正常。当然,我无法让用户完成该过程。
一旦我发现版本不匹配,这就是我启动第二个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应用程序更新时,我怎么能完全杀死第一个应用程序。
答案 0 :(得分:1)
你的问题是第一个JAR中的这一行:
process.waitFor();
这将等到第二个jar完成运行,然后第一个JAR才会退出 - 这是你不想要的(这称为死锁)。你想开始这个过程并放手。
如果你删除这一行,我相当自信,你应该没问题。