Вызов Java-программы из сценария CGI завершается неудачно - PullRequest
2 голосов
/ 24 сентября 2010

У меня есть скрипт Python CGI, из которого я пытаюсь вызвать программу Java для выполнения задачи. Программа Java использует JExcelAPI . Когда я запускаю скрипт Python из браузера, происходит сбой с сообщениями об ошибках, что он не может найти определения классов для классов из JExcelAPI. Я полагаю, это происходит потому, что скрипт Python CGI выполняется под пользователем apache, а у пользователя apache не установлены соответствующие переменные среды (а именно, переменная CLASSPATH). Я попытался вызвать программу с ключом -classpath /path/to/JExcelAPI, но это тоже не работает. Можете ли вы помочь мне найти способ информировать пользователя apache о JExcelAPI? Есть ли способ установить переменную среды CLASSPATH для пользователя apache?

Спасибо

1 Ответ

2 голосов
/ 24 сентября 2010

На ум приходит несколько решений:

  1. Создайте скрипт bash, который вызывает программу Java.Вы можете установить все переменные, которые вам нравятся, и выполнить отладку в командной строке, например, sudo -u apache /usr/local/bin/java-task-wrapper.Это значительно упрощает вызов его из cgi, и издержки bash незначительны по сравнению с раскруткой JVM.

  2. Создайте автономный исполняемый jar с такими инструментами, как uberjar.Больше никаких проблем с classpah, поскольку все содержится: java -jar java-task-standalone.jar

  3. exec java -cp /path/to/JExcelAPI:/my/program/classes com.acme.MainClass

  4. Обычно существует вариант exec, который принимаетдополнительный массив или hashmap для добавления переменных окружения.

Некоторые примечания:

  • глобальная установка переменной CLASSPATH больше не выполняется, поскольку это приводит ко многимконфликты.В скрипте-обертке все в порядке, так как возможности столкновения уменьшены.

  • JVM требует много времени для запуска, и выполнение будет медленным, поскольку у JIT нет шансов сотворить свою магию.Запуск вашего скрипта на легком веб-сервере, таком как Jetty или Winstone или прослушивание через сокет, устранит стоимость запуска и позволит JIT ускорить процесс.

...