Java 当作为可运行jar启动时,应用程序不会在64位窗口上关闭
我有一个在32位Win(XP和Win7)和eclipse(indigo)下开发/测试的应用程序。我使用File->Export->Runnable Jar(将所需库打包到生成的Jar中)部署应用程序。从那里我把它包装成一个可执行文件 我最近注意到我的应用程序不能在64位Win7(32位Win运行正常)中关闭(无论是“右上角X”还是alt+F4)。我开始在64位Win7中玩arround,发现当从eclipse启动时,我可以关闭应用程序。在我将它导出到一个可运行的罐子中之后,我无法关闭它。我的应用程序的所有其他部分都可以正常工作(同样在64位Win7下) 我有一个关机挂钩,运行方式如下:Java 当作为可运行jar启动时,应用程序不会在64位窗口上关闭,java,eclipse,64-bit,executable-jar,Java,Eclipse,64 Bit,Executable Jar,我有一个在32位Win(XP和Win7)和eclipse(indigo)下开发/测试的应用程序。我使用File->Export->Runnable Jar(将所需库打包到生成的Jar中)部署应用程序。从那里我把它包装成一个可执行文件 我最近注意到我的应用程序不能在64位Win7(32位Win运行正常)中关闭(无论是“右上角X”还是alt+F4)。我开始在64位Win7中玩arround,发现当从eclipse启动时,我可以关闭应用程序。在我将它导出到一个可运行的罐子中之后,我无法关闭它。我的应用
// initialize JFrame frame;
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeApplication();
}
});
frame.setVisible(true);
public void closeApplication() {
while (ConnectionManager.isConnected())
try {
ThreadManager.addMeasRequestPriority(eMeasRequest.DISCONNECT);
Thread.sleep(100);
} catch (InterruptedException e) {}
ConfigurationManager.saveToXML(new File("ressources/settings/startup.xml"));
System.exit(0);
}
我注意到GUI正在断开连接,但仅此而已(但这意味着输入了closeApplication()
)。问题是当我没有在eclipse中运行时,我没有System.out
,所以我看不出是否有异常或发生了什么。你知道我如何找到问题(或者已经知道问题)吗
可能的候选人:
- System.exit(0)在64位下有不同的行为(为什么会这样?是否有其他选择?
- 我无法创建/写入给定文件
(如何检查?startup.xml
- 我的64位Win7笔记本电脑中的一个小矮人用他的铁锤将主板上的一些东西短路,从而阻止应用程序关闭(我如何才能删除他?
- 其他
java.io.FileNotFoundException: ressources\settings\startupPlot0.apph (Access denied)
at java.io.FileOutputStream.open(Native Method)
...
但这怎么可能呢?此文件肯定存在,并以非64位Win写入。此外,同一目录中还有其他文件在该文件发生异常之前写入。它们有效(我刚刚检查过)。唯一的区别是:对于其他文件,我使用一个
new OutputStreamWriter(new FileOutputStream(File File File))
作为其他文件,使用一个new DataOutputStream(new FileOutputStream(File File File File))
作为此文件。我可以验证system.exit(0)是否在64位系统上工作。如果让我猜的话,我的答案是你没有断开连接,而是抛出了被中断的异常
我的建议:在catch语句中放入system.out.print语句,以查看是否正在捕获。。如果你是,你就知道你是个问题,如果不是,你就不会断开连接,坐在while循环中
编辑:尝试
FileOutputStream fos = new FileOutputStream("t.tmp"); // t.tmp is the directory&file name
ObjectOutputStream oos = new ObjectOutputStream(fos);
您可以使用以下命令确保始终调用System.exit(0),而不考虑任何异常:
public void closeApplication(){
try{
while (ConnectionManager.isConnected()){
try{
ThreadManager.addMeasRequestPriority(eMeasRequest.DISCONNECT);
Thread.sleep(100);
}
catch (InterruptedException e){
}
}
ConfigurationManager.saveToXML(new File("ressources/settings/startup.xml"));
}
finally{
System.exit(0);
}
}
不过,您也可能在while循环中无限循环。您可以从命令行启动jar并使用java-jar程序.jar查看输出吗?是否有可能其他进程锁定了该文件?在Win7中从命令行运行程序与从资源管理器启动程序时,我还看到了奇怪的权限相关问题。我认为Win7默认使用减少的非管理员权限或其他方式运行命令行进程,要解决这个问题,需要在一些高级属性对话框中进行修改。@Alex Nope,我检查过了。我也可以从中读取数据(我在启动时从中加载绘图,这很有效)。我只需对其进行写入(即打开一个
FileOutputStream
)……作为最后手段,您可以尝试右键单击资源管理器中的目录,转到“属性”>“安全”选项卡,并授予每个用户对该目录以及所有子目录的完全控制权。“如果这不能解决你的问题,我就没有主意了。”亚历克斯谢谢你的建议。我试过了,但没用(谢谢,这对我帮助很大。虽然我显然必须对错误/异常/正在发生的任何事情做些什么。)好吧,如果它现在退出,你就不会循环了。因此,只有一行可能导致异常请参见我的编辑。文件访问有点奇怪。但它也适用于其他文件…好主意,问题不在于断开连接(这很好),而是对文件的一些访问权限(请参阅我的编辑)。我想不出任何东西,为什么这不起作用…在文件位置添加一个if语句,该语句读取if(!file.exists())然后读取file.makedirs(),确保目录存在,然后再尝试写入任何内容。我只是这样做了,它告诉我文件存在。我在访问文件时仍然会遇到异常。你能双击该文件在读卡器中打开它吗?如果是这样,你能编辑文件吗?是的,我可以打开它,编辑它,等等。我也可以从应用程序中读取它,我只是不能写入它。很奇怪。。。