【问题标题】:Calling java program dependent on external library调用依赖于外部库的java程序
【发布时间】:2009-12-02 13:16:41
【问题描述】:

我正在尝试在 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程序没有任何影响。还是我错了?

否则,它应该在服务器中输出一个文件。但根本没有。那么,有什么问题呢?有什么想法吗?

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

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

【问题讨论】:

  • 你可以使用 java -cp >
  • 我认为 -cp 只在编译时影响程序。因为我试过这样,但还是不行。

标签: java php exec shell-exec


【解决方案1】:

你是对的,每个 shell_exec 都会创建一个单独的 shell。

env CLASSPATH=whatever java -switches

【讨论】:

    【解决方案2】:

    我会用

    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 说)。 ~ 由 shell 扩展,取决于您使用的 shell。

    【讨论】:

      【解决方案3】:

      尝试使用您要执行的命令创建一个简单的 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 程序根本没有写文件的权限。

      【讨论】:

      • 让你的php脚本调用你创建的shell脚本。
      【解决方案4】:

      你应该可以这样称呼它。

      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,如下所示:

      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 不允许您在设置变量时调用 export。所以这可能比上面的第二个选项更安全:

      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 背后发生了什么。
      • 第三种方法也没有。顺便说一句,可能是因为某些参数(例如 para_i)代表输入文件名,所以我必须为此指定完整路径吗?基本上我假设如果它在同一个工作目录中,就不会有问题。
      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多