关于Java jar文件中Manifest的问题

时间:2010-04-20 19:29:19

标签: java jar manifest

在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();

是否有任何问题导致笔文件过多?

4 个答案:

答案 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)

请确保在阅读后关闭文件。

如果您正在循环中将文件内容读入字节数组,那么在阅读下一个文件之前是否关闭了该文件?