繁体   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