Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Proyectos / JPlay CD – Autoejecutable para java

JPlay CD – Autoejecutable para java

Por jc mouse jueves, septiembre 8, 2011

En este tutorial se explica una forma de crear CD autoejecutable para programas hechos en java asi como para instalar la base de datos MySQL, tablas y datos,todo esto con el mismo lenguaje java. Mas que tutorial, esto seria una guia, porque explicar paso a paso la creación de este proyecto seria bastante largo y dificil de seguir por un novato, asi que newbies intentenlo bajo su propio riesgo, usuarios un poco más avanzados, no solo en Java sino en el uso de otros lenguajes y herramientas podran comprender lo que mas abajo tratare de explicar.

¿Que necesitamos?

  • Java
  • Editor java, Netbeans 6.9 o superior
  • Visual Studio para crear los instaladores (opcional)
  • Editor grafico: Photoshop, GIMP, etc
  • Un programa hecho en java que utilice MySql (El instalador)

¿Como funciona esto?

Este cd ejecutable que crearemos, es similar a los cd creados con programas como AutoPlay, el cual crea un programa autoarrancable con menus, skin, etc empaquetando todos los componente en carpetas los cuales podran ser ejecutados desde una interfaz amigable al usuario.

Diagrama de Funcionamiento

Diagrama de Funcionamiento (Clic para ampliar)

Los archivos en nuestro JPlay CD estan distribuidos en las siguientes carpetas (ver imagen abajo)

  • lib: almacena los archivos *.jar utilizados por nuestro programa JPlay CD
  • MySql: al macenara el instalador de MySQL
  • Programa_Java: Como su nombre lo dice, contiene nuestro programa escrito en Java (el instalador)
  • Recursos: en esta carpeta se podran almacenar otros recursos necesarios para nuestro programa, por ejemplo el archivo BackUp.sql, que contiene las tablas y los datos de nuestra base de datos, necesario para que nuestro programa funcione

La interfaz principal del programa estara compuesto de 4 botones:

  1. Instalar MySql: Este boton realiza una busqueda en la maquina cliente en busca del archivo MySql.exe si lo encuentra no ejecuta nada, sino lo encuentra ejecuta el instalador mysql
  2. Actualizar Java: este boton al ser presionado, abre en el navegador la pagina de descargas de Java
  3. Crear la base de datos: Comando por el cual se crea la base de datos necesaria para nuestro programa, asi como restaurar los datos y tablas que contienen nuestra informacion
  4. Instalar el programa Java: Este boton ejecuta el instalador de nuestro programa java, el cual puede ser creado en cualquier de las formas anteriormente vistas

Ahora continuemos con la explicación del proyecto, nuestro CD_Setup (asi se llama nuestro proyecto en netbeans) tiene la siguiente estructura:

En el paquete cd_Setup contiene las clases interfaz del poyecto, en el paquete clases, estan todas las funciones que utlizamos en el proyecto, si bien se hbiera podido agrupar todas esas clases en una sola, por motivos didacticos se prefirio dividir cada funcion en su propia clase para facilitar la comprension de las mismas.

IMPORTANTE: Este proyecto hace uso de tres librerias, Mysql-connector que se puede descargar gratis de la pagina de oracle, la libreria jcMousePanel que nos sirve para colocar imagenes dentro de JPanel desde netbeans, la puedes descargar de mi blog, y de una pequeña libreria CD_Button que como su nombre indica, contiene los botones graficos que utilizaremos en este proyecto, todas estas librerias estan dentro el archivo RAR que est al final de esta pagina.

El codigo de las clases utilizadas, todas ellas comentadasy creo bastante entendibles, es el siguiente:

Clase Abrir_EXE

package clases;
/**
* @web https://www.jc-mouse.net/
 * @author Mouse
 * CLASE QUE EJECUTA UN *.EXE DADO SU DIRECCION EN EL DISCO DURO
 */
public class Abrir_EXE {

    public void open(String exe){
        Runtime aplicacion = Runtime.getRuntime();
        try{aplicacion.exec(exe); }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

Clase Abrir_URL

package clases;
import java.awt.Desktop;
import java.net.URI;
import javax.swing.JOptionPane;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 * CLASE QUE ABRE LA PAGINA DE DESCARGA DE JAVA
 */
public class Abrir_URL {

    public void Open(){
        if(java.awt.Desktop.isDesktopSupported()){
            try{
                Desktop dk = Desktop.getDesktop();
                dk.browse(new URI("http://java.com/es/download/"));
            }catch(Exception e){
                JOptionPane.showMessageDialog(null,"ERROR: No se pudo abrir URL " + e.getMessage());
            }
        }
    }
}

Clase BuscadorDeFicheros

package clases;
import java.io.File;
import java.util.regex.Pattern;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 * CLASE PARA BUSCAR EL ARCHIVO "MYSQL.EXE" EN LA PC DEL CLIENTE
 */
public class BuscadorDeFicheros {
    //mas claro agua :)
    private String rutas_de_busqueda[] = {
    "c:/Program Files/MySQL",
    "c:/Archivos de Programa/MySQL",
    "c:/AppServ/MySQL"
    };
    //archivo a buscar
    private String fichero ="mysql\\.exe";
    //bandera para saber si el archivo existe o no
    private boolean existe=false;

    /* dados las rutas de busqueda, devuelve TRUE si existe archivo mysql.exe, FALSE si no*/
    public boolean existe(){
        boolean ok=false;
       for (int i = 2; i < rutas_de_busqueda.length; i++){
           ok=buscar(rutas_de_busqueda[i]);
           if(ok)break;
       }
       return ok;
    }

    /* busqueda recursiva */
    private boolean buscar(String ruta_inicial){
        File directorioInicial = new File(ruta_inicial);
        if (directorioInicial.isDirectory()){
            File[] ficheros = directorioInicial.listFiles();
            for (int i = 0; i < ficheros.length; i++){
                if (ficheros[i].isDirectory())
                    buscar(ficheros[i].getAbsolutePath());
                else if (Pattern.matches(fichero, ficheros[i].getName()))
                   existe=true;
            }
        }
        return existe;
    }
}

Clase MySql

package clases;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @web https://www.jc-mouse.net/
 * @author Mouse
 * CLASE ENCARGADA DE INTERACTUAR CON MYSQL
 */
public class MySQL {
  /* datos para la conexion */
    private String user = "";
    private String password = "";
    private String url = "jdbc:mysql://localhost/";
    private Connection conn = null;

    public MySQL(String user, String pass) {
        this.user = user;
        this.password= pass;
    }

    /* dado el nombre de una base de datos, crea esta si no existe, devuele TRUE si tiene exito*/
    public boolean crear_base_de_datos(String db){
        boolean ok=false;
        try{
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión a la base de datos TEST
         conn = DriverManager.getConnection(url + "test",user,password);
         if (conn!=null){
                PreparedStatement pstm = conn.prepareStatement("CREATE DATABASE IF NOT EXISTS `" + db +"` ");
                pstm.execute();
                pstm.close();
                ok=true;
         }
      }catch(SQLException e){
         javax.swing.JOptionPane.showMessageDialog(null, "Error" + e);
      }catch(ClassNotFoundException e){
        javax.swing.JOptionPane.showMessageDialog(null, "Error" + e);
      }
      return ok;
    }

}

Clase Restaurar_Database

package clases;
import java.io.*;
/**
* @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class Restaurar_DataBase {

     public boolean Proccess(String user, String pass, String database){
        boolean ok=false;
        String r = System.getProperty("user.dir");
        if(r.substring(r.length()-1, r.length()).equals("\\"))
            r =r.substring(0, r.length()-1);

        String file_sql = r + "/Recursos/database.sql";
        int processComplete = 0;
        Process runtimeProcess = null;
        String[] executeCmd = new String[]{"mysql", database, "--user="+user , "--password="+pass, "-e", " source "+file_sql };
        try{
            runtimeProcess = Runtime.getRuntime().exec(executeCmd);
            }catch (IOException ex){
               javax.swing.JOptionPane.showMessageDialog(null, "Error" + ex);
        }try{
            processComplete = runtimeProcess.waitFor();
        }catch (InterruptedException ex){
           javax.swing.JOptionPane.showMessageDialog(null, "Error" + ex);
        }

        if(processComplete == 0){
            ok=true;
            javax.swing.JOptionPane.showMessageDialog(null, "EXITO: Se restauro la Base de Datos. \n Clic en Terminar para volver al menu principal");
        }

        if(processComplete == 1){
            javax.swing.JOptionPane.showMessageDialog(null, "Error: No se pudo completar la operación");
        }
        return ok;
    }

}

Clase Worker

package clases;
import java.io.*;
/**
* @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class Restaurar_DataBase {

     public boolean Proccess(String user, String pass, String database){
        boolean ok=false;
        String r = System.getProperty("user.dir");
        if(r.substring(r.length()-1, r.length()).equals("\\"))
            r =r.substring(0, r.length()-1);

        String file_sql = r + "/Recursos/database.sql";
        int processComplete = 0;
        Process runtimeProcess = null;
        String[] executeCmd = new String[]{"mysql", database, "--user="+user , "--password="+pass, "-e", " source "+file_sql };
        try{
            runtimeProcess = Runtime.getRuntime().exec(executeCmd);
            }catch (IOException ex){
               javax.swing.JOptionPane.showMessageDialog(null, "Error" + ex);
        }try{
            processComplete = runtimeProcess.waitFor();
        }catch (InterruptedException ex){
           javax.swing.JOptionPane.showMessageDialog(null, "Error" + ex);
        }

        if(processComplete == 0){
            ok=true;
            javax.swing.JOptionPane.showMessageDialog(null, "EXITO: Se restauro la Base de Datos. \n Clic en Terminar para volver al menu principal");
        }

        if(processComplete == 1){
            javax.swing.JOptionPane.showMessageDialog(null, "Error: No se pudo completar la operación");
        }
        return ok;
    }

}

Para terminar un video en youtube de lo que queremos lograr

Enlace de descarga

Click para descargar

PD: Este proyecto no es complicado pero si largo de explicar, si no se entiende o si se tiene alguna duda, por favor comentar porque puedo equivocarme o dar por entendido muchas cosas, son las 2:04 AM estoy cansado pero no tengo sueño, algo confuso y desorientador :/, en fin, espero este proyecto le sirva a alguien

Tags

Artículos similares

Gestión de productos – El modelo (Parte 4)

En la estructura del proyecto, nuestro modelo mvc esta compuesto por tres paquetes, la vista, el modelo y controlador. L[...]

Activar/Desactivar Bluetooth

En este tutorial crearemos una aplicación sencilla para activar y desactivar el bluetooth de nuestros teléfonos intelige[...]

3 en raya java con MVC y Netbeans

Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la inter[...]

Instalación de Netbeans en Ubuntu

Netbeans es uno de los entornos de desarrollo integrado (Integrated Development Environment – IDE)  más conocidos[...]

Crea un servicio web REST con PHP y MYSQL -Parte 2

Segunda parte del tutorial «Crea un servicio web REST con PHP y MYSQL«, en esta segunda y ultima parte se completara la[...]

Primeros pasos con Vue CLI: Crea tu Entorno de Trabajo

En un post anterior [Introducción a VueJS framework para el desarrollo FrontEnd] realizamos una breve introducción a Vue[...]