可执行文件在包装和使用安装程序后未在 Windows 上退出
Executable file not quitting on Windows after wrapping and using installer
我正在尝试使用 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 后可以工作了!!
我正在尝试使用 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 后可以工作了!!