从PHP运行Java文件

从PHP运行Java文件,java,php,Java,Php,我发现我的问题还有几个其他的问题,但解决方案不起作用。我在本地服务器上有一个网页,您可以为整个java类输入文本。单击提交时,我希望显示输出。使用shell_exec,我可以编译java文件。不过,当我试着运行它时,我什么也得不到 shell_exec("javac /folder/Test.java"); // works echo shell_exec("/usr/bin/java folder.Test"); // nothing is returned 当我读到java为其他人解决了问

我发现我的问题还有几个其他的问题,但解决方案不起作用。我在本地服务器上有一个网页,您可以为整个java类输入文本。单击提交时,我希望显示输出。使用shell_exec,我可以编译java文件。不过,当我试着运行它时,我什么也得不到

shell_exec("javac /folder/Test.java"); // works
echo shell_exec("/usr/bin/java folder.Test"); // nothing is returned
当我读到java为其他人解决了问题时,我决定使用java的完整路径。当我跑步时:

/usr/bin/java folder.Test
在命令行中,它可以工作

Test.java文件如下所示:

package folder;
public class Test{
 public static void main(String[] args){
  System.out.println("testing");
 }
}
编辑:我无法让w0rldart工作。当我尝试马修的时候,我真的能看到一些东西。我尝试添加-classpath选项(我不确定是否正确使用了它)

我得到的错误与不带-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来显示其输出,但无论如何它可能值得尝试…

我很不确定这会有什么不同。但为了确定,您是否尝试过在命令后添加2>&1

echo shell_exec("/usr/bin/java folder.Test 2>&1");

我不认为system.out.println正在使用stderr来显示其输出,但无论如何都值得尝试…

如果要使用文件夹包中的测试类,则需要将Test.class保存在名为folder的文件夹中。然后您需要在类路径上有文件夹的父目录

因此,如果您的配置如下:
/rootdir/foo/folder/Test.class
,那么您可以像这样启动测试:
java-classpath/rootdir/foo folder.Test


我认为如果您使用php的shell_exec中的java,这种行为是相同的。

如果您想使用文件夹包中的测试类,那么Test.class需要保存在名为folder的文件夹中。然后您需要在类路径上有文件夹的父目录

因此,如果您的配置如下:
/rootdir/foo/folder/Test.class
,那么您可以像这样启动测试:
java-classpath/rootdir/foo folder.Test


我认为如果您使用php的shell_exec中的java,这种行为是相同的。

它确实起了作用,我得到了输出。但这是一个例外,当从命令行运行时,它会正确执行。以下是异常:线程“main”java.lang.NoClassDefFoundError中的异常:javafiles/Test引起的异常:java.lang.ClassNotFoundException:javafiles.Test位于java.net.URLClassLoader$1.run(URLClassLoader.java:217)位于java.security.AccessController.doPrivileged(本机方法)位于java.net.URLClassLoader.findClass(urlcloader.java:205)在sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)的java.lang.ClassLoader.loadClass(ClassLoader.java:321)在java.lang.ClassLoader.loadClass(ClassLoader.java:266)在java.lang.ClassLoader.loadClass(ClassLoader.java:321)在java.lang.ClassLoader.java:266中找不到主类:javafiles.test找不到主类:javafiles.test.test。我猜PHP进程无法访问系统变量$classpath。您可以尝试w0lrdart建议,或者在命令行中使用-classpath设置类路径(如果我没记错的话)。明白了,只需要更改我在-classpath选项中的内容。谢谢。它确实起了作用,我得到了输出。但这是一个例外,当从命令行运行时,它会正确执行。以下是异常:线程“main”java.lang.NoClassDefFoundError中的异常:javafiles/Test引起的异常:java.lang.ClassNotFoundException:javafiles.Test位于java.net.URLClassLoader$1.run(URLClassLoader.java:217)位于java.security.AccessController.doPrivileged(本机方法)位于java.net.URLClassLoader.findClass(urlcloader.java:205)在sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)的java.lang.ClassLoader.loadClass(ClassLoader.java:321)在java.lang.ClassLoader.loadClass(ClassLoader.java:266)在java.lang.ClassLoader.loadClass(ClassLoader.java:321)在java.lang.ClassLoader.java:266中找不到主类:javafiles.test找不到主类:javafiles.test.test。我猜PHP进程无法访问系统变量$classpath。您可以尝试w0lrdart建议,或者在命令行中使用-classpath设置类路径(如果我没记错的话)。明白了,只需要更改我在-classpath选项中的内容。谢谢。我回来说我修好了,这就是我最后做的。也许我应该早点回来看看,这样我就可以利用你的建议了。不管怎样,谢谢。我回来说我修好了,这就是我最后做的。也许我应该早点回来看看,这样我就可以利用你的建议了。谢谢你。