Вызов Java-программы зависит от внешней библиотеки - PullRequest
0 голосов
/ 02 декабря 2009

Я пытаюсь вызвать Java-программу в php, чтобы использовать ее с веб-интерфейсом.

Java-программа зависит от внешней библиотеки: commons-cli-1.2.jar

Так что в основном мне нужно экспортировать его перед вызовом java-программы; но если я сначала экспортирую его как:

shell_exec('export CLASSPATH=$CLASSPATH:~/lib/commons-cli-1.2.jar');

затем вызовите Java-программу как:

shell_exec('java ComputePagerank -i $para_i -d $para_d -e $para_e -o $para_o');

Я думаю, это создает разные оболочки для каждого вызова; тогда экспорт не имеет никакого влияния на программу Java. Или я не прав?

В противном случае он должен выводить файл на сервер. Но просто это не так. Итак, что не так? Есть идеи?

edit: Однако может ли это быть потому, что некоторые параметры, такие как para_i, обозначают имя входного файла, так что мне нужно указать полный путь для этого? Потому что я просто предполагаю, что если входной файл находится в том же рабочем каталоге, проблем не будет, не так ли?

edit-2: он правильно выводится, когда я использую командную строку;)

Ответы [ 4 ]

0 голосов
/ 02 декабря 2009

Попробуйте создать простой сценарий оболочки с командами, которые вы хотите выполнить. Вы можете передавать аргументы скрипту оболочки, так что это тоже не проблема.

например

 echo "Running Script..."
 java -cp $CLASSPATH:~/lib/commons-cli-1.2.jar ComputePagerank -i $1 -d $2 -e $3 -o $4 > message

и т.д.

Затем попробуйте сначала вызвать его из командной строки с некоторыми параметрами. Это выводило? Затем попробуйте вызвать его из сценария php. Это выводило? Если этого не произошло, вам может потребоваться проверить разрешения. Некоторое время назад у меня был похожий опыт с Java-программой, у которой просто не было разрешения на запись файла.

0 голосов
/ 02 декабря 2009

Вы должны быть в состоянии назвать это так.

shell_exec('java -cp $CLASSPATH:~/lib/commons-cli-1.2.jar ComputePagerank -i $para_i -d $para_d -e $para_e -o $para_o > message');

Другой вариант - раздавать 2 команды отдельно, но в одну и ту же оболочку, например:

shell_exec('export CLASSPATH=$CLASSPATH:~/lib/commons-cli-1.2.jar; java ComputePagerank -i $para_i -d $para_d -e $para_e -o $para_o > message');

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

shell_exec('CLASSPATH=$CLASSPATH:~/lib/commons-cli-1.2.jar; export CLASSPATH; java ComputePagerank -i $para_i -d $para_d -e $para_e -o $para_o > message');

другое редактирование: Если ничего из вышеперечисленного не сработает, вам придется делать еще несколько попыток устранения неполадок. Ваша java-программа работает из командной строки?

java -cp $CLASSPATH:/home/user/lib/commons-cli-1.2.jar ComputePagerank -i param1 -d param2 -e param3 -o param4 > message
0 голосов
/ 02 декабря 2009

Я бы использовал

shell_exec('java -cp $CLASSPATH:/home/yourname/dir/lib/commons-cli-1.2.jar ComputePagerank -i $para_i -d $para_d -e $para_e -o $para_o > message');

и (это важно) замените тильду (~) фактическим путем к вашему каталогу (/home/yourname скажем). ~ Расширяется оболочкой и зависит от того, какую оболочку вы используете.

0 голосов
/ 02 декабря 2009

вы правы, каждый shell_exec создает отдельную оболочку.

env CLASSPATH=whatever java -switches
...