2014-02-12 1 views
2

В настоящее время я работаю с Java 6, я не могу обновить. Я не могу использовать Java Web Start или превратить это настольное приложение в апплет. С учетом сказанного, я остался с копированием нового обновленного файла jar из папки общего доступа и вставки его в папку пользователя. Я не профессиональный кодер, я или код в Perl, но последние 6 месяцев работал с Java. Таким образом, вы можете увидеть некоторые проблемы, не стесняйтесь указывать их. Мне нравится учиться.Java two jvm update system, no jws или applet

Я реализовал две сессии 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(); 
} 

После того, как второй файл банка, который, отвечающие за обновление запусков. У меня есть это в основном метод этого файла (с другим кодом исключенного конечно):

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 строк кода, легко пропустить один.Я думаю, мы все были там. –