【发布时间】:2014-03-11 09:24:20
【问题描述】:
我目前正在使用 Java 6,我无法更新。我无法使用 Java Web Start 或将此桌面应用程序转换为小程序。话虽如此,我只能从共享文件夹中复制新更新的 jar 文件并将其粘贴到用户文件夹中。我不是专业的编码员,我最初使用 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 应用程序更新时,我怎样才能完全杀死第一个应用程序。
【问题讨论】:
-
其下载的文件位于共享驱动器中。但它可能位于下一个文件夹中。所以我认为这不会有什么不同。所以我想答案是否定的。
-
一方面,共享位置很慢(美国的海岸到海岸)。其次,有可能损坏该文件。第三,如果该文件正在使用中,我将无法更新/删除/升级该文件。这些只是我能想到的一些原因,这些原因使该建议成为一个糟糕的主意。我想我在第一段中详细阐述了我的要求、限制和期望。遗憾的是我无法控制它们,否则我可以轻松使用 JWS 或将其放在小程序上。