2016-02-22 2 views
0



Я работаю над JAVA с JSmooth.
Я вижу, что при каждом запуске создается tmp JAR.

Созданные файлы tmp jar составляют приблизительно 10 Мб.

Когда я выхожу из исполняемого приложения JAVA, созданного JSmooth,
файлы temp jar остаются на каждом запуске.

Я прочитал следующую тему о JSmooth:
JSmooth - exit applicationУборка вопроса на выходе

7.1.2.
Что происходит с извлеченным файлом jar при выходе из приложения Java?

По возможности обертки удаляют файл при выходе. Обратите внимание, однако, что это не всегда возможно. Например, экземпляр JVM, созданный с использованием JVM DLL, не разгружается. Такое поведение (не называть его ошибкой) задокументировано Sun, и для этого нет никакой известной работы.

Как оболочка Windowed, так и Console всегда предпочитают методы instaviation JVM, которые позволяют им удалять временную банку после выхода приложения. Обратите внимание, что вложение jar в exe не требуется, всегда безопасный выбор - просто оставить его в файловой системе рядом с исполняемым файлом, либо в том же каталоге, либо в родном или родительском каталоге.

Обратите внимание, что удаление файлов в каталоге Windows TEMP не требуется для приложений Windows, и большинство приложений просто оставляют их, позволяя операционной системе управлять им. Стандартное поведение MS Windows заключается в том, чтобы предложить пользователю удалить временные файлы, когда диски работают на доступном пространстве.


Я пытался удалить банку на выходе:

//For matching convention, I wrote the file in a not null package 
package main; 

import java.io.File; 

//It is an utility class, so the class is final 
public final class Constants { 

    //The tmp folder key 
    private static final String TMP_FOLDER = "java.io.tmpdir"; 

    //The main class 
    private static Class<?> _mainClass_ = Constants.class; 

    //It is an utility class, so hide the constructor 
    private Constants(){ 
    } 

    public static void main(String[] _args) { 
     //Processing 
     //.... 
     exit(); 
    } 

    /**@see System#exit(int)*/ 
    public static void exit() { 
     String path_ =_mainClass_.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     //For keeping portability OS, replace all back slashes by slashes 
     path_ = new File(path_).getAbsolutePath().replace("\\", "/"); 

     //For keeping portability OS, replace all back slashes by slashes 
     String folder_ = System.getProperty(TMP_FOLDER).replace("\\", "/"); 

     if (path_.startsWith(folder_)) { 
      //If the jar is located in the temp folder, then delete it before exit. 
      System.out.println("path: "+path_); 
      System.out.println("folder: "+folder_); 

      //Try remove temp jar 
      new File(path_).delete(); 
      new File(path_).deleteOnExit(); 
     } 
     //Exit the program 
     System.exit(0); 
    } 
} 

Мой файл JSmooth:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<jsmoothproject> 
    <JVMSearchPath>exepath</JVMSearchPath> 
    <JVMSearchPath>registry</JVMSearchPath> 
    <JVMSearchPath>javahome</JVMSearchPath> 
    <JVMSearchPath>jrepath</JVMSearchPath> 
    <JVMSearchPath>jdkpath</JVMSearchPath> 
    <JVMSearchPath>jview</JVMSearchPath> 
    <arguments></arguments> 
    <bundledJVMPath>jre</bundledJVMPath> 
    <currentDirectory>${EXECUTABLEPATH}</currentDirectory> 
    <embeddedJar>false</embeddedJar> 
    <executableName>Test.exe</executableName> 
    <initialMemoryHeap>-1</initialMemoryHeap> 
    <jarLocation>target\Test.jar</jarLocation> 
    <mainClassName>main.Constants</mainClassName> 
    <maximumMemoryHeap>1073741824</maximumMemoryHeap> 
    <maximumVersion>1.7</maximumVersion> 
    <minimumVersion>1.7</minimumVersion> 
    <skeletonName>Windowed Wrapper</skeletonName> 
    <skeletonProperties> 
     <key>Message</key> 
     <value>Java has not been found on your computer. Do you want to download it?</value> 
    </skeletonProperties> 
    <skeletonProperties> 
     <key>URL</key> 
     <value>http://www.java.com</value> 
    </skeletonProperties> 
    <skeletonProperties> 
     <key>SingleProcess</key> 
     <value>0</value> 
    </skeletonProperties> 
    <skeletonProperties> 
     <key>SingleInstance</key> 
     <value>0</value> 
    </skeletonProperties> 
    <skeletonProperties> 
     <key>JniSmooth</key> 
     <value>0</value> 
    </skeletonProperties> 
    <skeletonProperties> 
     <key>Debug</key> 
     <value>1</value> 
    </skeletonProperties> 
</jsmoothproject> 

Я думаю, что это очень опасно, о свободном пространстве (в каждой запуск, свободное пространство уменьшается на 10 Мб) для компьютера , так как компьютер может быть неисправен.

Надеюсь, мой вопрос точен, и я ничего не нарушаю.
Я благодарю очень много людей, которые могли бы время ответить.

+1

Что происходит, когда вы пытаетесь его удалить? – Ferrybig

+0

@Ferrybig: файлы tmp JMP не удаляются. Никакое исключение не выбрасывается. Обратите внимание, что имена файлов tmp Jar отформатированы temp .jar. Пример: temp1.jar. Новичок-разработчик не знает, что в папке temp создается не только файл JMP-файла tmp, но также файл tmp Jar остается в временном файле. Для начинающих пользователей трудно понять, что они должны удалить файлы tmp jar после выполнения. – cardman

+1

Вы можете указать Windows для удаления этих файлов по крайней мере при перезагрузке с помощью PendigFileRenameOperations. Или вы пытаетесь удалить те из предыдущих запусков при каждом новом запуске. – Marged

ответ

2

Java не может удалить файл, который в настоящее время используется под Windows. Это ограничение Windows.

Это значит, что попытка удалить их из вашей программы либо через file.delete(), либо file.deleteOnExit() будет сбой. Это также является причиной ошибки в JSmooth и почему она не может удалить файл.

В то время как вы не можете непосредственно удалить файл, вы можете начать боковую программу как ЦМД запланировать удаление файла 10 секунд или чуть позже, это можно сделать, выполнив при выходе из вашей программы следующее:

new ProcessBuilder("cmd","/c","ping 127.0.0.1 && del "+filename).inheritIO().start(); 

Поскольку Windows не имеет надлежащей команды сна для командной строки, я злоупотребляю командой ping, чтобы дать 3-секундную задержку перед запуском следующей команды. Этот трюк объясняется в: How to sleep for 5 seconds in Windows's Command Prompt? (or DOS)

0

@Ferrybig:
Наконец,

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

Кроме того, если используется файл tmp jar, удаление его не выполняется, поэтому удаление в конце выполнения является безопасным.

Мой новый код:

//For matching convention, I wrote the file in a not null package 
package main; 

import java.io.File; 

//It is an utility class, so the class is final 
public final class Constants { 

    //The tmp folder key 
    private static final String TMP_FOLDER = "java.io.tmpdir"; 

    //The main class 
    private static Class<?> _mainClass_ = Constants.class; 

    //It is an utility class, so hide the constructor 
    private Constants(){ 
    } 

    public static void main(String[] _args) { 
     //Processing 
     //.... 
     exit(); 
    } 

    /**@see System#exit(int)*/ 
    public static void exit() { 
     String path_ =_mainClass_.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     //For keeping portability OS, replace all back slashes by slashes 
     path_ = new File(path_).getAbsolutePath().replace("\\", "/"); 

     //For keeping portability OS, replace all back slashes by slashes 
     String folder_ = System.getProperty(TMP_FOLDER).replace("\\", "/"); 

     if (path_.startsWith(folder_)) { 
      //If the jar is located in the temp folder, then delete all previous jars before exit. 
      //Begin of my new code 
      try { 
       for (File f: new File(folder_).listFiles()) { 
        if (!f.getName().toLowerCase().endsWith(".jar")) { 
         continue; 
        } 
        f.delete(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      //End of my new code 
     } 
     //Exit the program 
     System.exit(0); 
    } 
} 


Я благодарю Ferrybig и Marged за то, что помогли мне.

Смежные вопросы