Вопрос или проблема
Я использую Java Print Service API (javax.print) для отправки заданий на печать в определенную очередь принтера на системе AIX. Мой код отлично работает с Java 8, но при переключении на Java 11 выполнение завершается с IOException, связанным с флагами -o, передаваемыми к спулеру печати AIX.
Подробности окружения
- Операционная система: AIX с родным
спулером печати AIX (не CUPS). - Версии Java:
Java 8 (работает нормально).
Java 11 (вызывает IOException).
После дальнейшей проверки я обнаружил, что флаг -o job-sheets=standard передается по умолчанию в команду lpr. Спулер печати AIX не поддерживает этот флаг, что приводит к ошибке выполнения задания.
IOException: error=254 запуская: ‘/usr/bin/lpr’ ‘-PTESTPRN2’ ‘-J Java
Printing’ ‘-o job-sheets=standard’
‘/tmp/javaprint13160595099572358650’ использование: lpr [-fghjlmnprs]
[-PPrinter] [-#NumberCopies] [-CClass]
[-JJob] [-TTitle]
Я создаю спулер печати с помощью smit spooler -> add queue -> remote
Я не нашел никакой опции для установки баннера, который в конечном итоге задается атрибутом jobsheet=standard.
Для более детальной информации: у нас принтер подключен к printserver (dlink small printserver) через usb, запрос AIX к printserver. Кроме того, lpr -p /etc/hosts работает из командной строки (без флага -o)
Ответ или решение
Ваша проблема связана с несовместимостью Java Print Service API на Java 11 с AIX print spooler из-за использования флага "-o job-sheets=standard", который не поддерживается AIX. В Java 8 все работает корректно, что указывает на изменения в поведении API или его зависимостей в Java 11. Давайте разберём это подробно.
Причины проблемы
Основной проблемой является конфигурация флагов, передаваемых команде lpr
по умолчанию – -o job-sheets=standard
. Данный параметр, который используется для настройки баннеров или аннотаций при печати, поддерживается, например, в системах с печатающим сервисом CUPS, однако AIX print spooler его не признаёт. Это приводит к IOException
при попытке выполнить печать.
Рекомендации по решению проблемы
-
Измените конфигурацию Java Print Service:
Java 11 может использовать специфические настройки, которые не поддерживаются вашим окружением. Поскольку стандартных методов Java API для непосредственного управления флагами lpr не предусмотрено, рассмотрите возможность изменения конфигурации или переопределения стандартных параметров в вашем коде. Это может потребовать глубокого анализа исходного кода или использование обходных решений. -
Создание временного решения на уровне системы:
Если изменений кода не избежать, попробуйте использовать wrapper-скрипт для командыlpr
, который будет перехватывать и корректировать флаги, непосредственно перед вызовом AIX print spooler.Пример скрипта:
#!/bin/bash ARGS="" for ARG in "$@"; do if [[ "$ARG" != "-o" && "$ARG" != "job-sheets=standard" ]]; then ARGS="$ARGS $ARG" fi done /usr/bin/lpr $ARGS
-
Обратитесь к документации и обновлениям Java:
Проверьте, возможно ли добавить в код некоторое исключение для конкретной платформы или используйте обновления Java, которые могут исправить данную несовместимость. -
Переключение на альтернативное решение:
Если проблема не решается, рассмотрите возможность использования другой подсистемы печати (например, переход на CUPS) или использование промежуточного программного обеспечения, которое поможет в преобразовании печатных заданий со специфическими флагами.
Заключение
Важно учесть уникальные требования вашего окружения и обеспечить совместимость через корректные настройки или разработку дополнительных решений. При разработке и поддержке кода на новых версиях Java следует ожидать изменений в устоявшихся методах и API, сохраняя при этом гибкость и адаптивность в использовании технологии. В этом процессе ключевыми остаются знания инфраструктуры и практическое тестирование.
Эти шаги помогут вам справиться с возникшей проблемой и улучшить ваш процесс печати на системе AIX.