[英]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.