在java jar文件中的Manifest文件中是否必须有classpath?我们可以在没有类路径的情况下工作吗?
我问这个的原因是因为我有一个服务器应用程序的jar文件。当我尝试连接许多与服务器的连接时,服务器关闭并且错误是“打开的文件太多”,当搜索它时,我发现了一个Sun Bug http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6446657。然后我检查了,我在Jar文件中有一个类路径条目。所以这个问题就出现了。
编辑:我的Filr读取代码是:
// Creating a new File instance
File file= new File(fileName);
// Creates a DataInputStream that uses the specified underlying InputStream.
DataInputStream input = new DataInputStream(new FileInputStream(file));
Data = new byte[(int)file.length()];
// Reads bytes from the input stream and stores them into the buffer array Data.
input.read(Data);
// Closes this input stream and releases any system resources associated with the stream.
input.close();
是否有任何问题导致笔文件过多?
答案 0 :(得分:1)
该条目是完全可选的,但您指向的错误与编译有关,而不是运行时,因此这不太可能是问题所在。
应用程序服务器通常非常耗费文件,如果没有采取任何措施来增加打开文件的限制,则默认值可能不够高。
在CentOS上,我们发现即使在QA(非负载测试,只是功能测试)中,服务器也可以使用JBoss 4.2来最大化其ulimit。
编辑:您在保持文件打开方面发布的代码唯一的错误是您应该使用finally关闭您的信息流。在服务器应用程序中,可能是这段代码经常抛出异常,导致文件无法关闭(因为你没有在最后关闭它们),随着时间的推移,这些打开的文件句柄会加起来。您如何做到这一点还有其他问题(比如依靠available()
来确定字节数组的大小),但这不会影响您的问题。
另一种可能性是,在* nix系统套接字下使用与文件相同的资源,因此可能是您有太多套接字(在系统配置允许的范围之上)打开,导致此代码无法执行。
答案 1 :(得分:0)
Jar清单文件中的Class-Path
条目完全是可选的,许多工作的Jar文件不使用该字段。
答案 2 :(得分:0)
可执行JAR必须通过清单文件的Class-Path标头引用它所需的所有其他依赖JAR。如果使用-jar选项,则JVM将忽略环境变量CLASSPATH和命令行上指定的任何类路径。除此之外,您对bug数据库的链接表明它是一个封闭的错误。
答案 3 :(得分:0)
请确保在阅读后关闭文件。
如果您正在循环中将文件内容读入字节数组,那么在阅读下一个文件之前是否关闭了该文件?