簡體   English   中英

Java兩個jvm更新系統,沒有jws或applet

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM