Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭.jar文件后强制删除它(创建Java卸载程序)_Java_Windows_Jar - Fatal编程技术网

关闭.jar文件后强制删除它(创建Java卸载程序)

关闭.jar文件后强制删除它(创建Java卸载程序),java,windows,jar,Java,Windows,Jar,我已经创建了基于Java的卸载程序,但仍然存在一个问题:在关闭卸载程序后,如何删除卸载程序.jar文件(以及相关目录,例如…/SomeApplication/uninstaller/uninstaller.jar)?卸载后留下一些文件不是很好。我可以通过使用外部实用程序(bat或sh)将卸载程序复制到临时文件夹(%temp%)并从该位置执行程序来实现这一点 我觉得这是一个有效的实现,因为它删除了永久性文件,剩下的唯一文件会随着时间的推移被删除,或者至少被指示为“temp”。您可以尝试file.d

我已经创建了基于Java的卸载程序,但仍然存在一个问题:在关闭卸载程序后,如何删除卸载程序.jar文件(以及相关目录,例如…/SomeApplication/uninstaller/uninstaller.jar)?卸载后留下一些文件不是很好。

我可以通过使用外部实用程序(bat或sh)将卸载程序复制到临时文件夹(
%temp%
)并从该位置执行程序来实现这一点


我觉得这是一个有效的实现,因为它删除了永久性文件,剩下的唯一文件会随着时间的推移被删除,或者至少被指示为“temp”。

您可以尝试
file.deleteOnExit()
,但它不会被隔离在每个jvm上工作。 另一种选择是编写运行程序或使用包装器,并在java程序退出后添加delete

更新

示例:deinstall.bat

java -jar uninstall.jar
REM check exit status of run
delete jar
示例:平滑为可执行包装。
此包装使用exitOnDelete并将jar复制到temp文件夹。

是的,我考虑过这一点,但是如果我将UnistallString 2命令写入一个字符串中,例如(只是一个有错误的示例)
cp到%temp%目录&..jawaw.exe-jar UninstallerCopy.jar
-我得到了找不到文件的错误(但它是创建的)-如果我再次执行相同的命令-一切正常。例如,在
IzPack
卸载程序中,他们设法做到了这一点-如果复选框“强制删除…”已选中。卸载程序位于已安装的应用程序路径中。让用户/系统执行一个批处理文件,该文件将复制该文件,然后执行副本。添加错误处理以等待几次尝试…恐怕我对卸载的系统方面不够熟悉。不,它不起作用。.Runner也不是一个选项-因为执行.jar wi在启动另一个进程exit.bat文件之前,我不会退出:)在bat文件中,我已使用
cp
uninstaller.jar复制到%TEMP%目录,并启动了
java-jar%TEMP%\uninstaller.jar
。但我认为有一个大问题——当bat文件启动时——控制台窗口打开了。有没有一些选项可以在没有控制台窗口的情况下执行它?我想我会尝试C++,稍后会看到。最后,用C++应用程序,我设法达到了预期的效果。我使用
CreateProcessW
将uninstall.jar文件复制到%TEMP%目录,然后再次使用
CreateProcessW
启动复制文件。我必须添加
ExitProcess(0)在C++代码的结尾,使Studio.EXE不被使用。很遗憾,我不能只使用Java应用程序来启动。bat文件是无用的,因为要在没有控制台窗口的情况下启动它,只能使用命令行开头的
start
选项。但在这种情况下,复制文件时进程不等待,并且在文件尚未创建时启动应用程序。因此,C++作为一个卸载程序。