调用依赖于外部库的java程序

调用依赖于外部库的java程序,java,php,exec,shell-exec,Java,Php,Exec,Shell Exec,我试图用php调用一个java程序,将其用于web界面 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

我试图用php调用一个java程序,将其用于web界面

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');
我认为它会为每个调用创建不同的shell;那么导出对java程序没有任何影响。还是我错了

否则,它应该在服务器中输出一个文件。但事实并非如此。那么,怎么了?有什么想法吗

编辑:但是可能是因为某些参数,例如para_i代表输入文件名,所以我必须为此指定完整路径?因为我只是假设如果输入文件在同一个工作目录中,就不会有任何问题,对吗


edit-2:使用命令行时,它会正确输出;)

没错,每个shell\u exec都会创建一个单独的shell

env CLASSPATH=whatever java -switches

你应该可以这样称呼它

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');
另一个选项是分别向同一个shell发出这两个命令,如下所示:

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不允许调用导出。因此,这可能比上述第二种选择更安全:

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
我会用

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
say)替换波浪号(~)。~由shell展开,并取决于您正在使用的shell。

尝试使用要执行的命令创建一个简单的shell脚本。您可以将参数传递给shell脚本,因此这也不是问题

比如说

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


然后,首先尝试使用一些参数从命令行调用它。它输出了吗?然后尝试从php脚本调用它。它输出了吗?如果没有,则可能需要检查权限。不久前,我也有过类似的经历,一个Java程序根本没有写文件的权限。

你可以使用Java-cp,我认为-cp只能在编译时影响程序。因为我就这样试过,但还是不行。嗯,我以前也试过第二种方法。但仍然不起作用。我也做了参数检查,但简单地说,它们也被正确地传递了。我不知道shell_exec背后发生了什么。第三种方法也没有。顺便说一句,这可能是因为一些参数,如para_i代表输入文件名,所以我必须为此指定完整路径?基本上我假设如果它在同一个工作目录中,就不会有问题。让您的php脚本调用您创建的shell脚本。