【发布时间】:2012-07-19 07:43:19
【问题描述】:
正如图块所说,我的 Java 应用程序无法正常工作,因为它在 Eclipse 上开发时工作正常。
我完成了在 Eclipse 上构建和测试我的应用程序。正如我所料,它工作得很好。我需要将它部署为一个可运行的 jar,这样我的客户就不能在他们的系统上使用它。我通过在 Eclipse 上导出它使其成为一个可运行的 jar。 当我运行可运行 jar 时,应用程序开始正常工作一段时间并停止读取文件。我在 Eclipse 上的相同代码上没有任何问题。
似乎不起作用的源sn-p如下。
sfis = new SmbFileInputStream(sFile);
in = new BufferedInputStream(sfis);
byte buf[] = new byte[(int)sFile.length()];
int pos = 0;
int size = 10;
int temp;
while((size=in.read(buf, pos, size)) > 0){
pos += size;
temp = buf.length - pos;
if(temp < 10){
size = temp;
}
}
在 Eclipse 上它不会导致任何问题。它完美地从 SMB 连接读取数据并完成其工作。但是从 jar 应用程序来看,它似乎在某个时候停止从 while 循环内的输入流中读取。 这是一个我从未经历过的非常奇怪的案例。我找不到任何解决方案。
这是因为我的代码或 Eclipse 可能错误制作的 jar 文件吗?
--------- 附加信息 -------
在 Edmondo1984 的大力帮助下,我找到了 jar 程序停止的地方。 当它从 SmbFile 进入 inputstream 时,会创建一个新线程 jcifs.util.transport.Transport,该线程被简单地阻塞,应用程序创建另一个 jcifs.util.transport.Transport,依此类推。创建8个或9个jcifs.util.transport.Transport线程后,卡住了,什么也不做。
相同的代码,相同的 jcifs 库。但是在 Eclipse 上运行和在本地机器上作为可运行 jar 运行时的工作方式不同。 我不知道为什么会这样。
【问题讨论】:
-
Eclipse 可能无法将正确的 jar 放入“打包的 jar”中,但这通常会导致类加载错误。你在测试同一个文件吗?
-
你必须给自己一些关于正在发生的事情的可见指标。即在 try catch 中输出某种关于所发生事件的有意义的信息。上面的错误消息对于调试正在发生的事情很有用。
-
@Edmondo1984 正如您所说,如果 Eclipse 未能添加应用程序所需的一些库,它将无法启动。但它开始运行。哦,是的,我正在测试同一个文件。
-
@Davos555 正如我所解释的,它在 Eclipse 上运行良好。没有错误被抛出。我实际上更喜欢让应用程序出错。这些代码在 catch 块内。我上次所做的只是将 sysout 放在 while 循环中。它会打印一段时间并变慢。然后它就停止了。应用程序仍在运行,但没有错误。
-
当 Jconsole 卡住时,您能否将其附加到您的应用程序,以便查看应用程序挂起的位置?
标签: java jar inputstream