2013-09-28 4 views
3

Помогите пожалуйста. Я не могу понять, в чем проблема с запуском java-файлов через proc_open(). Он работал над программами C, и я был в состоянии получить выход на линию, так что я думаю, что нет ничего плохого в выборке выходного потока таким образом:Запуск java в PHP с помощью proc_open() и получение вывода

$ctr = 0; 
$score_ctr = 0; 
$out2 = ""; 



    while (!feof($pipes[1])) { 

    $out2[$ctr]= fgets($pipes[1]); 
    $ctr++; 

    } 

    fclose($pipes[1]); 

Для запуска Java в PHP, я использую эти коды:

Проверка расширения, а затем компилировать, если ява (это было успешным, так как он был в состоянии произвести файл класса в том же каталоге:

if($ext == "java" || $ext =="JAVA"){ //case for java 
     exec('cd \xampp\htdocs\ci_user\uploads & javac '.$file); 
} 

enter image description here


Чтобы выполнить программу,

if($ext == "java" || $ext =="JAVA"){ //case for java 

    //Removes '.java' extension for cmd 
    $name2 = preg_replace("/\\.[^.\\s]{3,4}$/", "", $name); 

    //Command to be executed 
    $p = 'cd \xampp\htdocs\ci_user\uploads & java '.$name2; 


    $process = proc_open($p, $descriptorspec, $pipes); 
} 

Я попытался запустить эту команду в CMD окна, и он работал (был в состоянии запустить Java и печатать "Hello, World"), поэтому я уверен, что в этом нет ничего плохого.

cd \xampp\htdocs\ci_user\uploads & java HelloWorld 

Я получаю эту ошибку в моем файле журнала ошибок:

 java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 51.0 
      at java.lang.ClassLoader.defineClass1(Native Method) 
      at java.lang.ClassLoader.defineClassCond(Unknown Source) 
      at java.lang.ClassLoader.defineClass(Unknown Source) 
      at java.security.SecureClassLoader.defineClass(Unknown Source) 
      at java.net.URLClassLoader.defineClass(Unknown Source) 
      at java.net.URLClassLoader.access$000(Unknown Source) 
      at java.net.URLClassLoader$1.run(Unknown Source) 
      at java.security.AccessController.doPrivileged(Native Method) 
      at java.net.URLClassLoader.findClass(Unknown Source) 
      at java.lang.ClassLoader.loadClass(Unknown Source) 
      at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
      at java.lang.ClassLoader.loadClass(Unknown Source) 
     Could not find the main class: HelloWorld. Program will exit. 

Я не знаю, если РНР с использованием другого исходного пути Java при выполнении Java через proc_open. Я предположил, что, поскольку он использует cmd моего окна, не будет проблем с загрузкой библиотеки или проблем, связанных с «версией».

В чем проблема? Спасибо огромное! Я был бы признателен за любой ответ.

+0

Какова ваша версия Java? –

+0

@ MichałRybak java version "1.7.0_07" Рабочая среда Java (TM) SE Runtime Environment (сборка 1.7.0_07-b11) 64-разрядная виртуальная машина Java HotSpot TM (сборка 23.3-b01, смешанный режим) – user2800050

+0

и версия javac ? Ваша проблема может быть связана с несовместимостью между вашей версией JRE и вашим файлом класса. [подробнее здесь] (http://stackoverflow.com/questions/10382929/unsupported-major-minor-version-51-0) –

ответ

0

OMG. Большое спасибо сэром Михалом Рыбаком (@MichalRybak) за то, что помогли мне добраться до этого решения. Поскольку я не могу понять, как изменить версию java-версии proc_open() или PHP, я просто скомпилировал java-программы и совместил классы с более низкими версиями.

Я изменил этот код:

exec('cd \xampp\htdocs\ci_user\uploads & javac '.$file); 

к этого:

exec('cd \xampp\htdocs\ci_user\uploads & javac -source 1.4 -Xlint:-options '.$file); 

СПАСИБО ТАК СИЛЬНО !!!!!!!!!! Ты действительно очень помог мне получить этот ответ, сэр! : D