Вопрос касательно манифеста в jar-файле Java - PullRequest
1 голос
/ 20 апреля 2010

Обязательно ли указывать classpath внутри файла манифеста внутри jav-файла jar? можем ли мы работать, не имея внутри него пути к классам?

Причина, по которой я спрашиваю об этом, заключается в том, что у меня есть файл JAR для серверного приложения. Когда я пытался соединить многие соединения с Сервером, Сервер отключался, и была ошибка «Слишком много открытых файлов», при поиске я обнаружил один Sun Bug http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6446657. Затем я проверил, и у меня была запись classpath в файле 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 ]

1 голос
/ 20 апреля 2010

Запись абсолютно необязательна, но указанная ошибка связана с компиляцией, а не с временем выполнения, поэтому весьма маловероятно, что это проблема.

Серверы приложений часто очень требовательны к файлам, и если ничего не было сделано для увеличения лимита открытых файлов, значение по умолчанию может быть недостаточно высоким.

Например, на CentOS мы обнаружили, что даже в QA (не нагрузочное тестирование, а только функциональное тестирование) сервер может максимально использовать свой предел с JBoss 4.2.

РЕДАКТИРОВАТЬ: единственное, что не так с кодом, который вы разместили в плане сохранения файлов, это то, что вы должны использовать finally , чтобы закрыть ваш поток. В серверном приложении может случиться так, что этот код часто вызывает исключение, в результате чего файлы не закрываются (потому что вы не закрываете их в конечном итоге), и со временем эти дескрипторы открытых файлов складываются. Существуют и другие проблемы, связанные с тем, как вы это делаете (например, для определения размера байтового массива available()), но это не должно влиять на вашу проблему.

Другая возможность состоит в том, что под * nix системными сокетами используется тот же ресурс, что и у файлов, поэтому может случиться так, что у вас слишком много открытых сокетов (сверх того, что настроено для системы), в результате чего этот код не сможет быть выполнен.

0 голосов
/ 21 апреля 2010

Убедитесь, что вы закрыли файл после прочтения.

Если вы читаете содержимое файла в байтовом массиве в цикле, закрываете ли вы файл перед тем, как читать следующий?

0 голосов
/ 20 апреля 2010

Исполняемый JAR-файл должен ссылаться на все другие зависимые JAR-файлы, необходимые для этого, через заголовок Class-Path файла манифеста Переменная среды CLASSPATH и любой путь к классу, указанный в командной строке, игнорируются JVM, если используется параметр -jar. Кроме того, ваша ссылка на базу данных ошибок указывает на то, что это закрытая ошибка.

0 голосов
/ 20 апреля 2010

Запись Class-Path в файле манифеста Jar не является обязательной, многие рабочие файлы Jar не используют это поле.

...