【问题标题】:Java two jvm update system, no jws or appletJava 2 jvm更新系统,没有jws或者applet
【发布时间】:2014-03-11 09:24:20
【问题描述】:

我目前正在使用 Java 6,我无法更新。我无法使用 Java Web Start 或将此桌面应用程序转换为小程序。话虽如此,我只能从共享文件夹中复制新更新的 jar 文件并将其粘贴到用户文件夹中。我不是专业的编码员,我最初使用 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 应用程序更新时,我怎样才能完全杀死第一个应用程序。

【问题讨论】:

  • 其下载的文件位于共享驱动器中。但它可能位于下一个文件夹中。所以我认为这不会有什么不同。所以我想答案是否定的。
  • 一方面,共享位置很慢(美国的海岸到海岸)。其次,有可能损坏该文件。第三,如果该文件正在使用中,我将无法更新/删除/升级该文件。这些只是我能想到的一些原因,这些原因使该建议成为一个糟糕的主意。我想我在第一段中详细阐述了我的要求、限制和期望。遗憾的是我无法控制它们,否则我可以轻松使用 JWS 或将其放在小程序上。

标签: java swing jar


【解决方案1】:

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

process.waitFor();

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

如果你删除这条线,我很有信心,你应该没问题。

【讨论】:

  • 哇,太棒了。我怎么会错过这个。你摇滚!在超过 3,000 行代码之后,这是完成这个应用程序所缺少的部分。 :D
  • :P 当你有 3k 行代码时,很容易漏掉一行。我想我们都去过那里。
猜你喜欢
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2013-10-08
  • 2012-04-06
  • 2014-10-20
相关资源
最近更新 更多