Java两个jvm更新系统,没有jws或applet

时间:2014-02-12 19:58:42

标签: java swing jar

我目前正在使用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应用程序更新时,我怎么能完全杀死第一个应用程序。

1 个答案:

答案 0 :(得分:1)

你的问题是第一个JAR中的这一行:

process.waitFor();

这将等到第二个jar完成运行,然后第一个JAR才会退出 - 这是你不想要的(这称为死锁)。你想开始这个过程并放手。

如果你删除这一行,我相当自信,你应该没问题。