Я нашел пару других вопросов с моей проблемой, но решения не сработали. У меня есть веб-страница на моем локальном сервере, чтобы вы могли вводить текст для целого класса Java. Когда нажата кнопка отправки, я хочу, чтобы вывод отображался. Используя shell_exec, я могу скомпилировать java-файл. Тем не менее, я ничего не получаю, когда пытаюсь запустить его.
shell_exec("javac /folder/Test.java"); // works echo shell_exec("/usr/bin/java folder.Test"); // nothing is returned
Я решил использовать полный путь к java, когда прочитал, что он решил проблему для кого-то другого. Когда я запускаю:
/usr/bin/java folder.Test
из командной строки он работает.
Файл Test.java выглядит так:
package folder; public class Test{ public static void main(String[] args){ System.out.println("testing"); } }
EDIT: Я не мог заставить w0rldart работать. Я действительно могу увидеть что-то, когда я попробую Матье. Я попытался добавить параметр -classpath (я не уверен, правильно ли я его использую)
echo shell_exec("java -classpath ./folder/ Test 2>&1");
Я получаю ту же ошибку, что и без -classpath:
Exception in thread "main" java.lang.NoClassDefFoundError: Test Caused by: java.lang.ClassNotFoundException: Test at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) Could not find the main class: Test. Program will exit.
ЭТО РАБОТАЕТ: Просто нужно было снять период с
echo shell_exec("java -classpath ./folder/ Test 2>&1"); //error echo shell_exec("java -classpath /folder/ Test 2>&1"); //works
Я очень сомневаюсь, что это изменит ситуацию. Но, чтобы быть уверенным, вы попробовали добавить 2> и 1 после своей команды?
echo shell_exec("/usr/bin/java folder.Test 2>&1");
Я не думаю, что system.out.println использует stderr для отображения своего вывода, но, возможно, стоит попробовать …
Если вы хотите использовать тестовый класс из пакета папок, тогда Test.class необходимо сохранить в папке с именем folder. Тогда вам нужно иметь родительский каталог папки в CLASSPATH.
Поэтому, если ваша конфигурация такова: /rootdir/foo/folder/Test.class
вы можете запустить тест следующим образом: java -classpath /rootdir/foo folder.Test
.
Я думаю, что такое поведение одинаково, если вы используете java из shell_exec php.