我正在尝试从jar文件创建Windows安装程序。一切都成功到了最后阶段。
我使用launch4j将jar文件包装为exe文件,然后使用Advanced-Installer和Inno-Setup来创建MSI文件夹。它们都可以工作,但是,在某些计算机上,提取的exe文件不会关闭,只能使用任务管理器将其杀死。
在我的Java文件中,我处理退出过程(最终使用System.exit(0)
),因为我想询问用户是否希望在退出之前保存文件。
这是我的代码:
exitListener = new ExitListener();
theMainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
ProgramLog.logException(Level.SEVERE, "Problem...WindowsClosing method", new Exception());
exitListener.actionPerformed(null);
}
});
记录器在jar中时工作正常(创建文件并给出异常),在exe中时工作正常,但是一旦我将其包装到MSI中,一旦打开它就不会关闭,并且看不到任何记录在日志中的信息,这意味着它未达到
windowClosing
事件。我已经在两台Windows计算机上单独尝试了exe文件,并且工作正常(保存并退出);但是一旦从安装程序中提取出来,它就不会退出。
任何建议表示赞赏。
编辑
因此,感谢MadProgrammer,我才发现问题出在记录器本身。将编辑我的代码并根据其工作方式进行更新
最佳答案
解
因此,感谢MadProgrammer,我发现问题出在Logger的保存位置,而不是某些Windows计算机没有退出可执行文件。我已将位置从ProgramFiles文件夹更改为{user.home} \ AppData \ Local {Program company} {Program name}
我以前为记录器编写的代码是
public ProgramLog() {
try {
FileHandler handler = new FileHandler(logFile);
logger = Logger.getLogger("com.program.msgs");
logger.addHandler(handler);
} catch (Exception e) {
}
}
我已将其编辑为
public ProgramLog() {
try {
String path = System.getProperty("user.home") + File.separator
+ "AppData" + File.separator + "Local" + File.separator
+ "CompanyName" + File.separator + "CompanyProduct" + File.separator;
File f = new File(path);
f.mkdirs();
FileHandler handler = new FileHandler(path + logFile);
logger = Logger.getLogger("com.program.msgs");
logger.addHandler(handler);
} catch (Exception e) {
}
}
现在,我的可执行文件将其包装到MSI中后即可工作!!