正如磁贴所说,我的 Java 应用程序无法运行,因为它在 Eclipse 上开发时运行良好。
我已完成在 Eclipse 上构建和测试我的应用程序。正如我所料,它工作正常。我需要将它部署为可运行的 jar,这样我的客户就无法在他们的系统上使用它。我通过在 Eclipse 上导出它使它成为一个可运行的 jar。 当我运行可运行的 jar 时,应用程序开始正常工作一段时间并停止读取文件。我在 Eclipse 上的相同代码上没有遇到任何问题。
似乎不起作用的源代码片段如下。
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 进入输入流时,一个新的线程 jcifs.util.transport.Transport 被创建,线程被简单地阻塞,应用程序创建另一个 jcifs.util.transport.Transport,等等。创建 8 或 9 个 jcifs.util.transport.Transport 线程后,它被卡住了,什么都不做。
同样的代码,同样的jcifs库。但是在 Eclipse 上运行和作为可运行 jar 在本地机器上运行之间的工作方式不同。 我不知道为什么会这样。
最佳答案
“流中没有更多内容”的返回值为 -1
(参见 Javadoc)。
想象一下,如果您尝试 in.read(buf, pos, size)
但底层仍然不可用,会发生什么情况。然后调用立即返回,返回值为 0
(零)。这样,循环条件评估为 false 并退出循环。所以我认为您应该与 != -1
进行比较。
另一个可能的问题:您还可以考虑如果 size = 0
(例如由于上述情况)和 temp >= 10
会发生什么。因为你直接把size
的值反馈给in.read(buf, pos, size)
作为读取的最大字节数,最后可能会无限大循环,假设您已经更正了与 != -1
的比较。
关于java - Java 应用程序在 Eclipse 上运行良好,但在部署为可运行的 jar 后无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556095/