我正在使用 JSmooth 开发 JAVA。
我看到每次启动时都会创建一个 tmp JAR。
创建的 tmp jar 文件大约为 10 Mb。
当我退出由 JSmooth 构建的可执行 JAVA 应用程序时,
临时 jar 文件会在每次启动时保留。
我阅读了以下关于 JSmooth 的主题:
JSmooth - 退出应用程序
7.1.2.
当 java 应用程序退出时,提取的 jar 文件会发生什么?
只要有可能,包装器就会在退出时删除文件。但是请注意,这并不总是可能的。例如,使用 JVM DLL 创建的 JVM 实例不会完全卸载。Sun 记录了这种行为(不是称其为错误),并且没有已知的解决方法。
Windowed 和 Console wrapper 总是更喜欢 JVM 实例化方法,这些方法允许它们在应用程序退出后删除 temp jar。请注意,不需要在 exe 中嵌入 jar,将其留在可执行文件附近的文件系统上始终是一个安全的选择,无论是在同一目录中,还是在同级目录或父目录中。
另请注意,Windows 应用程序不需要删除 windows TEMP 目录中的文件,大多数应用程序只是将它们保留,让操作系统管理它。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 Mb)是非常危险的,因为计算机可能出现故障。
我希望,我的问题是准确的,我不会无缘无故地打扰人们。
我非常感谢能够抽出时间回答的人。