La Web del Programador: Comunidad de Programadores
 
    Pregunta:  17685 - EJECUTAR APLICACIóN INDEPENDIENTE
Autor:  jose
¡Socorro, Auxilio!
Resulta que estoy desarrollando una aplicación en java pero sin ser un applet en Jbuilder4. Entonces desearía ejecutarla fuera del entorno y en un ordenador que no tenga instalado dicho entorno. Intento dos cosas:
1º. Copiar los .class y ejecutar con java.exe .
2º. Crearme un archivo .jar.
Con el 1º, el problema que tengo es que me sale un error más o menos así:
Error opening registry key "Software\javasoft\Java Runtime Enviroment"
Error: could not find java.dll
Error: could not find java 2 runtime environment
Sé que se trata de algo así de instalar el jre, pero veo que la carpeta que posee jbuilder con dicho nombre ocupa mas de 20 Mb, ¡mucho que instalar en el otro ordenador!. ¿Qué fichero/s serían estrictamente necesarios?.
Con el 2º, el problema radica en que me creo el archivo .jar , pero cuando lo intento ejecutar tampoco me deja. Me dá errores distintos: o me dice que no encuentra la clase principal (cosa que resuelvo con el manimest.mf) o me dá error en thread main ...

Y si ya no es mucho preguntar, ¿porqué me crea el jbuilder tantas copias de los fichero class?, por ej. del menu.class me crea menu1$.class ... hasta menu12$.class. Y lo curioso es que si borro alguno de estos ficheros, no me deja ejecutar desde fuera del jbuilder (en el ordenador que tengo instalado el jre), y si los recupero,sí.

Por favor échenme una mano que es urgente.
Gracias de antemano.

  Respuesta:  Rodrigo López
La única pregunta que te puedo contestar con certeza es la última:

- El compilador de Java genera archivos como menu1$.class (con un signo $ en medio) cuando en tu código fuente has declarado clases internas (inner class). Esto no es algo propio de JBuilder, sino de Java.

Un ejemplo de declaración de clase interna es:

class Algo extends Frame{
//Nota lo siguiente. No terminamos inmediatamente con punto
//coma (;), sino que abrimos una llave y ponemos codigo adentro.
// Eso es una clase interna y sólo se puede hacer cuando creamos
//un objeto. Ahi va:

Button ElBoton = new Button(){ //Aquí declaramos una clase interna
public boolean mouseDown(Event e, int x, int y){
//Hacer algo cuando presionen el botón
}
};
public Algo(){
add(ElBoton);
pack();
show();
}
}

El ejemplo anterior crea un Frame (una ventana) con un botón. En el momento de crear un objeto botón declaramos una clase interna. Cuando compiles el archivo se crearán dos archivos class: algo.class y algo1$.class.

Cuando el usuario presiona el boton con el mouse se activa el método "mouseDown".

- Acerca del problema de que no te encuentra una clase principal, debe ser porque no has declarado una funcion "main" en ninguna parte. La función main se declara así:
public static void main( String argv[ ] ){ ....} , y debe estar dentro de cualquier clase (esa será la clase principal para una aplicación que no sea un Applet).