Problema em Executar um arquivo .class em tempo real

5 respostas
M

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

Por favor alguem me ajude

è para o meu TCC…

muito obrigado

Marcus Paulo

5 Respostas

maxguzenski

mas tem certeza q ele nao lança nenhum erro ? olhou nos logs do teu servidor ?

T

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.
aborges

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 :wink:

danieldestro

Olha o mel na chupeta, amigo:

import java.lang.reflect.*;

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();
		}
	}
}
package a;

public class RunMe {
	public void execute() {
		System.out.println("Estou executando!");
	}
}

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

smota

Esse negocio de exec pra compilar é furada, limita demais o tratamento de erros que vc pode ter, use o javac do tools mesmo … um bom comeco: http://www.javaworld.com/javatips/jw-javatip131.html

e pra executar use a ideia do artigo acima … vc vai poder tratar as Exceptions do codigo alheio …

Criado 26 de outubro de 2004
Ultima resposta 3 de nov. de 2004
Respostas 5
Participantes 6