【问题标题】:Question regarding Manifest in Java jar file关于 Java jar 文件中 Manifest 的问题
【发布时间】:2010-04-20 19:29:18
【问题描述】:

在 java jar 文件中的 Manifest 文件中是否必须包含类路径?我们可以在没有类路径的情况下工作吗?

我问这个的原因是因为我有一个服务器应用程序的 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 年前修复了。您的问题出在其他地方。
  • 你试过没有?如果你的 jar 文件依赖于其他 jar 文件,你只需要类路径。
  • 嗨,Baluc,我正在一个地方从文件中读取字节,这是唯一的文件读取操作。我有一个 ReadBytes 函数,它获取文件名,然后以字节为单位返回内容。那么我可以将其视为唯一的罪魁祸首,但无法找到确切的错误是什么。有什么建议吗?

标签: java jar manifest


【解决方案1】:

该条目是完全可选的,但您指向的错误与编译有关,而不是运行时,因此这不太可能是问题。

应用服务器通常非常需要文件,如果没有做任何事情来增加打开文件的限制,默认值可能不够高。

例如,在 CentOS 上,我们发现即使在 QA(不是负载测试,只是功能测试)中,服务器也可以使用 JBoss 4.2 最大化其 ulimit。

编辑:您在保持文件打开方面发布的代码的唯一错误是您应该使用finally 关闭您的流。在服务器应用程序中,可能是此代码经常引发异常,导致文件无法关闭(因为您没有在 finally 中关闭它们)并且随着时间的推移,这些打开的文件句柄会加起来。您的操作方式还有其他问题(例如依靠available() 来确定字节数组的大小),但这不会影响您的问题。

另一种可能性是,在 *nix 系统下,套接字消耗与文件相同的资源,因此可能是您打开了太多套接字(超过系统配置允许的数量),导致此代码无法执行。

【讨论】:

    【解决方案2】:

    Jar 清单文件中的 Class-Path 条目完全是可选的,许多工作 Jar 文件不使用该字段。

    【讨论】:

      【解决方案3】:

      可执行 JAR 必须通过清单文件的 Class-Path 标头引用它所需的所有其他相关 JAR。如果使用 -jar 选项,JVM 会忽略环境变量 CLASSPATH 和命令行上指定的任何类路径。除此之外,您指向错误数据库的链接表明它是一个已关闭的错误。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 我在 File Read 中这样做: // 创建一个新的 File 实例 File FileToBeRead = new File(fileName); // 创建一个使用指定底层 InputStream 的 DataInputStream。 DataInputStream 输入 = new DataInputStream(new FileInputStream(FileToBeRead));数据 = 新字节[(int)FileToBeRead.length()]; // 从输入流中读取字节并将它们存储到缓冲区数组 Data 中。输入.读取(数据); // 关闭此输入流并释放与该流关联的所有系统资源。输入.close();
        猜你喜欢
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        相关资源
        最近更新 更多