2014-02-12 29 views
2

我目前正在使用Java 6,我無法更新。我無法使用Java Web Start或將此桌面應用程序轉換爲小程序。就這樣說,我只剩下從共享文件夾複製新的更新的jar文件並將其粘貼到用戶文件夾中。我不是一個專業的編碼人員,我使用Perl編寫代碼,但在過去的6個月中一直在使用Java。所以你可能會看到一些問題,隨時指出它們。我喜歡學習。Java兩個jvm更新系統,沒有jws或applet

我已經實現了兩個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應用程序。

+0

下載的文件位於共享驅動器中。但它可能位於下一個文件夾中。所以我不認爲這會有所作爲。所以我想這個答案不會。 –

+0

舉個例子,分享地點很慢(美國的Coast to Coast)。其次,有可能破壞該文件。第三,如果該文件正在使用,我將無法更新/刪除/升級該文件。這些只是我能想到的一些原因,這使得這個建議成爲一個可怕的想法。我想我在第一段中闡述了我的要求,限制和期望。可悲的是我無法控制它們,否則我可以輕鬆使用JWS或將它放在小程序上。 –

回答

1

您的問題是此行的第一個JAR:

process.waitFor(); 

這會等到你的第二個罐子完成運行前的第一個JAR將退出 - 這是你不想要的(這被稱爲死鎖) 。你想啓動流程並放手。

我相當有信心,如果你刪除這條線,你應該沒問題。

+0

哇,太棒了。我怎麼錯過了。你搖滾!超過3000行代碼後,這是完成這個應用程序的缺失部分。 :D –

+0

:P當你有3k行代碼時,很容易錯過一個。我想我們都去過那裏。 –