java - Java 应用程序在 Eclipse 上运行良好,但在部署为可运行的 jar 后无法正常运行

标签 java jar inputstream

正如磁贴所说,我的 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/

相关文章:

java - 从InputStream中查找特定字节数据

android - 将 inputStream 转换为 FileInputStream?

java - 如何解决补充 Maven 子模块中的循环依赖?

java - 没有主要 list 属性,在 jar 中

java - 从第一个元素到最后一个元素迭代 json

java - 可运行的jar文件可以解释回java源代码吗

java - 使用 JarInputStream 打开 jar 时,Jenkins 上的构建失败

java - 为java程序制作本地远程的最简单方法是什么?

java - 有没有在 java 中读取 mdict *.MDX 文件的库?

java - 由于字符串太大而无法获取有效负载(base64 图像)