Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't execute java program with php exec function

Tags:

java

php

exec

I'm trying to execute a java program to sign a pdf file with php exec function but doesn't work:

exec('java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);

When I execute it, the $output is an empty array and $return is an int(1), but if I run:

java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD

In command line it works. Can anyone help me?

Thank you.

like image 542
josebailo Avatar asked Feb 27 '12 15:02

josebailo


3 Answers

@Treffynnon is right. The difference between executing program from command prompt and from other program is environment variables and permissions.

So, first check whether user that runs your server where PHP is running has permissions to run the application and to access appropriate files.

Then verify the path to

  1. java
  2. PROGRAM.jar
  3. ORIGIN.pdf
  4. DESTINY.pdf

You should probably modify the path, i.e. better specify it either using relative or absolute notation. It is because current working directory might be different in 2 cases.

Good luck.

like image 186
AlexR Avatar answered Sep 28 '22 07:09

AlexR


Almost certainly PHP won't know the path of "java". If you're in Linux, run "which java" and put the whole java path that you get back in the exec call, e.g.

exec( '/usr/bin/java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);
like image 43
Strawp Avatar answered Sep 28 '22 07:09

Strawp


Finally I could resolve the problem.

The solution is:

exec('java -Djava.awt.headless=true -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);

Adding the -Djava.awt.headless=true option you're telling java that it's an indirect call so it hasn't control over keyboard, mouse, etc.

like image 41
josebailo Avatar answered Sep 28 '22 06:09

josebailo