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?
¿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.
Los archivos en nuestro JPlay CD estan distribuidos en las siguientes carpetas (ver imagen abajo)
La interfaz principal del programa estara compuesto de 4 botones:
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
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
En la estructura del proyecto, nuestro modelo mvc esta compuesto por tres paquetes, la vista, el modelo y controlador. L[...]
En este tutorial crearemos una aplicación sencilla para activar y desactivar el bluetooth de nuestros teléfonos intelige[...]
Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la inter[...]
Netbeans es uno de los entornos de desarrollo integrado (Integrated Development Environment – IDE) más conocidos[...]
Segunda parte del tutorial «Crea un servicio web REST con PHP y MYSQL«, en esta segunda y ultima parte se completara la[...]
En un post anterior [Introducción a VueJS framework para el desarrollo FrontEnd] realizamos una breve introducción a Vue[...]