Discussion:
Arrancar aplicación desde un Servlet
(demasiado antiguo para responder)
Alberto Fernández López
2004-02-28 16:09:43 UTC
Permalink
Saludos,
Mi pregunta es la siguiente, ¿como arrancar una aplicación desde un Servlet?

Digamos que tengo una aplicación Web, desde una de las páginas de
administración
necesito arrancar un servicio, una aplicación Servidor. Pulso un botón y
llamo
a un servlet que crea un hilo e intenta arrancar la aplicación.
Tengo la aplicación en un .jar y la llamada desde la línea de comandos sería
"javaw -jar Servidor.jar"
Utilizo Apache Tomcat 4.1. Cuando presiono el botón se llama al servlet e
intenta cargar, pero
siempre sale una ventanita de la JVM cantando una excepción fatal, yo no se
si es que no puedo
crear un hilo en el servlet container, o si es por que la aplicación es
gráfica, no se... A ver si a
alguien se le ocurre algo. Graciñas.

El codigo del servlet:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
Runnable hilo = new Runnable() {
public void run() {
try {
Runtime.getRuntime().exec("javaw -jar Servidor.jar");
}
catch (IOException ex) { }
}
};
(new Thread(hilo)).start();
response.sendRedirect("admin_config.jsp");
}
doble-click
2004-03-01 09:44:55 UTC
Permalink
....
a ver si lo entiendo... desde Java, quieres lanzar una aplicacion Java
pasando por el command????

sinceramente es complicarse la vida demasiado, en primer lugar porque tienes
que tener presente los permisos que tiene el servlet para poder lanzar
ejecutables.... por defecto no creo que este limitado pero no me gusta

Si tuvieras que lanzar un .exe o algo parecido no nos queda mas remedio que
pasar por el simbolo de sistema.... pero si es que lo que quieres es lanzar
una .jar.... pos solo tienes que crear su instancia...

ahora.... me diras que es un jar, y que por codigo no puedes tener una
instancia de la clase principal porque no se hace reutilizable, o porque
simplemente el .jar nisiquiera es tuyo y no conoces cual es la clase
principal. Pues para eso tenemos las clases Reflect (no recuerdo en que
paquete), mediante estas clases puedes instanciar otras clases o llamar a
metodos en tiempo de ejecucion..... tiene metodos que te dicen los
constructores de una clase, los metodos y todo eso, es lo que usan los IDE's
para mostrar la lista de metodos de un .class

No se si te servirá o si te molará hacerlo con el getRuntime() pero yo me
miraria esta opcion
un saludo
Post by Alberto Fernández López
Saludos,
Mi pregunta es la siguiente, ¿como arrancar una aplicación desde un Servlet?
Digamos que tengo una aplicación Web, desde una de las páginas de
administración
necesito arrancar un servicio, una aplicación Servidor. Pulso un botón y
llamo
a un servlet que crea un hilo e intenta arrancar la aplicación.
Tengo la aplicación en un .jar y la llamada desde la línea de comandos sería
"javaw -jar Servidor.jar"
Utilizo Apache Tomcat 4.1. Cuando presiono el botón se llama al servlet e
intenta cargar, pero
siempre sale una ventanita de la JVM cantando una excepción fatal, yo no se
si es que no puedo
crear un hilo en el servlet container, o si es por que la aplicación es
gráfica, no se... A ver si a
alguien se le ocurre algo. Graciñas.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
Runnable hilo = new Runnable() {
public void run() {
try {
Runtime.getRuntime().exec("javaw -jar Servidor.jar");
}
catch (IOException ex) { }
}
};
(new Thread(hilo)).start();
response.sendRedirect("admin_config.jsp");
}
Alberto Fernández López
2004-03-03 00:25:47 UTC
Permalink
El tema ya está resuelto, si que se podia hacer como yo lo hacia, pero habia
problemas con los espacios
de las rutas, que no eran exactamente las que especifiqué ahí abajo. Otro
tema es que con javaw no
iba, iba con java -jar.
Post by doble-click
....
a ver si lo entiendo... desde Java, quieres lanzar una aplicacion Java
pasando por el command????
No desde Java exactamente, sino desde Tomcat.
Lo que quiero hacer, es arrancar una aplicación standalone que da un
servicio a clientes
conectados a través de internet, desde la aplicación Web asociada.
Post by doble-click
sinceramente es complicarse la vida demasiado, en primer lugar porque tienes
que tener presente los permisos que tiene el servlet para poder lanzar
ejecutables.... por defecto no creo que este limitado pero no me gusta
No están limitados los permisos de un servlet, se ejecutan como una
aplicación
cualquiera en el servidor local.
Post by doble-click
Si tuvieras que lanzar un .exe o algo parecido no nos queda mas remedio que
pasar por el simbolo de sistema.... pero si es que lo que quieres es lanzar
una .jar.... pos solo tienes que crear su instancia...
El problema de esto, es que si lanzo un .jar creando una instancia de su
clase
principal, luego hago un System.exit(0); en esa aplicación y me chapa el
Tomcat tambien,
por que System.exit termina la ejecución de la JVM en que se ejecute ese
proceso,
y haciendo así es en la del propio Tomcat.
Post by doble-click
ahora.... me diras que es un jar, y que por codigo no puedes tener una
instancia de la clase principal porque no se hace reutilizable, o porque
simplemente el .jar nisiquiera es tuyo y no conoces cual es la clase
principal. Pues para eso tenemos las clases Reflect (no recuerdo en que
paquete), mediante estas clases puedes instanciar otras clases o llamar a
metodos en tiempo de ejecucion..... tiene metodos que te dicen los
constructores de una clase, los metodos y todo eso, es lo que usan los IDE's
para mostrar la lista de metodos de un .class
Si si, tu opción ya se como es, el .jar es mio y todo eso, pero la solucion
no me
vale por lo que comenté antes.
Post by doble-click
No se si te servirá o si te molará hacerlo con el getRuntime() pero yo me
miraria esta opcion
un saludo
Al final quedó asi, por si a alguien le sirve de algo.

public void doPost(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
final ServletContext contexto =
this.getServletConfig().getServletContext();

if (contexto.getAttribute("Servidor") == null)
{
final Process proceso = Runtime.getRuntime().exec("java -jar
/ajeweb/servidor.jar");
contexto.setAttribute("Servidor", proceso);

Runnable hilo = new Runnable() {
public void run() {
try {
proceso.waitFor();
contexto.removeAttribute("Servidor");
}
catch (Exception e) { }
}
};
(new Thread(hilo)).start();
}
response.sendRedirect("/ajeweb/admin/admin_config.jsp");
}

Hay que tener cuidado por que debe estar el comando java en el PATH del
sistema, pero por
el resto funciona perfectamente. Las operaciones con el contexto que
aparecen por ahi, es
para poder igualmente parar la aplicación desde el servidor. Guardo el
objeto Process que
se crea en el contexto de la aplicación Web (esto lo proporciona Tomcat),
asi puedo
controlar si está arrancado el servidor, si esta parado y todo esto,
recuperando ese valor.
El waitFor() que aparece, es para que, cuando se termine la aplicación
Servidora dandole
al Salir de la propia aplicación, y no al Parar de la web se detecte y se
actualice el estado.

Ya digo que la unica diferencia esta en la llamada a exec, los parametros
estaban mal, y no se
referenciaba bien la ruta del .jar, nada mas. La idea era buena.
Post by doble-click
Post by Alberto Fernández López
Saludos,
Mi pregunta es la siguiente, ¿como arrancar una aplicación desde un
Servlet?
Post by Alberto Fernández López
Digamos que tengo una aplicación Web, desde una de las páginas de
administración
necesito arrancar un servicio, una aplicación Servidor. Pulso un botón y
llamo
a un servlet que crea un hilo e intenta arrancar la aplicación.
Tengo la aplicación en un .jar y la llamada desde la línea de comandos
sería
Post by Alberto Fernández López
"javaw -jar Servidor.jar"
Utilizo Apache Tomcat 4.1. Cuando presiono el botón se llama al servlet e
intenta cargar, pero
siempre sale una ventanita de la JVM cantando una excepción fatal, yo no
se
Post by Alberto Fernández López
si es que no puedo
crear un hilo en el servlet container, o si es por que la aplicación es
gráfica, no se... A ver si a
alguien se le ocurre algo. Graciñas.
public void doPost(HttpServletRequest request, HttpServletResponse
response)
Post by Alberto Fernández López
throws IOException, ServletException
{
Runnable hilo = new Runnable() {
public void run() {
try {
Runtime.getRuntime().exec("javaw -jar Servidor.jar");
}
catch (IOException ex) { }
}
};
(new Thread(hilo)).start();
response.sendRedirect("admin_config.jsp");
}
Loading...