Ola salve, comunidade, bem eu to com um problema que eu não sei mais o que faço.
tenho que executar um arquivo, que o usuario manda…
ex.
1 - Usuario manda um arquivo .java
2 - o Servlet compila (Ate aqui ta ok)
3 - O Servlet executa o .class (Aqui é o Problema)
// aqui recebe o arquivo .java e compila (Funcionou OK)
String t[] = {"javac",LOCAL_UPLOAD+ arquivo};
Runtime.getRuntime().exec(t);
// Aqui o arquivo .class era para ser executado, porem não da erro aparente, mas não executa
String d = LOCAL_UPLOAD+ arquivo.substring(0,arquivo.length()-5);
String m[] = {"java ", d};
Runtime.getRuntime().exec(m);
Obs. nesse String d = … na verdade ele pega o arquivo exemplo, Codigo.class e diminui para apenas Codigo
Se você quer simplesmente executar um .class e se você conseguir jogar o resultado de sua compilação no CLASSPATH do seu web container (o programa que executa os servlets, ex. Tomcat), use algo como Class cls = Class.forName(“Codigo”); e chame o método “main” por reflection (algo como java.lang.reflect.Method m = cls.getMethod(“main”, new Class[]{(String[]).class}); m.invoke (null, new Object[]{new String[]{“arg1”, “arg2”, “arg3”}};
onde “arg1”, “arg2”, “arg3” são os argumentos para o método main.
obviamente você deve testar o que escrevi, mas a idéia é essa.
Para compilar seu .java, analise a hipotese de se utilizar o “tools.jar”, uma ferramenta que vem no j2sdk. Com ele vc podera tratar tb os erros de compilacao, caso seja postado um arquivo com algum problema
public class Test {
private static final String className = "RunMe";
public static void main( String[] args ) {
try {
// aqui recebe o arquivo .java e compila (Funcionou OK)
String t[] = { "javac", "a/"+className+".java" };
Runtime.getRuntime().exec( t );
Class cls = Class.forName("a."+className);
Object o = cls.newInstance();
Method meth = cls.getMethod("execute", null);
meth.invoke(o, null);
} catch( Exception e ) {
e.printStackTrace();
}
}
}[/code]
[code]package a;
public class RunMe {
public void execute() {
System.out.println("Estou executando!");
}
}[/code]
Porém tem um problema. A primeira vez que você roda o programa, ele não executa a classe. Creio que tem algo a ver com o Classloading da classe gerada em runtime.
Dá uma estudada sobre classloading e classloader.
Abraços