style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Ayuda aplicacion hecha en java ejecutar en linux

Buenos dias a todos los del foro. Tengo una inquietud y no se como resolverlo.
estoy por terminar de desarrollar un programa en java con arquitectura cliente servidor
(RMI) con base de datos mysql, reportes.
El programa se está ocupando a medias porque aun falta subir unos modulos y hacerle unos retoques
el programa servidor se esta corriendo en una equipo con sistema operativo Ubuntu 14.10,
ahí está instalado la base de datos de mysql, la máquina virtual de java.
en este equipo como les comento es donde ejecuto igual el programa servidor de la aplicacion java y se conecta
a mysql pero como aun no termino el proyecto asi que nomas ejecuto el puro archivo jar.
teniendo esta estructura. Pongo una carpeta que se llama:

- Servidor (dentro de esta carpeta va la librerías necesarias para su ejecución, un archivo src y la aplicacion jar)
- lib (contiene las librerías)
- src(contiene los reportes de jasperreport)
- Servidor.jar (la aplicacion)
......................................................
Como aun no esta terminado el programa cada semana voy haciendo modificación entonces aun no lo instalo
entonces nomas ejecuto el programa.. pero lo tengo que ejecutar desde la terminal de comandos como root
java -jar Servidor.jar asi si me corre el programa y funcionan los reportes que son llamados desde la
aplicacion cliente..

Pero si lo ejecuto normal el servidor.jar con doble clic, cuando un cliente hace la petición para mostrar un reporte, no lo puede
mostrar ya que la aplicacion servidor como que no puede leer los archivos de reporte.
me dije entre mismo pues toda mi aplicacion lo voy a empaquetar en un archivo deb y lo voy a instalar
para que ya aparezca en el menú de aplicaciones de ubuntu..pero igual así lo ejecuto e igual los clientes
cuando hacen una petición para mostrar un reporte el servidor no puede leer el reporte..

...........................................................

Los clientes pues los instalo en máquinas windows pero ahí no hay problema porque el jar lo convierto
en exe,y despues la empaqueto con el Inosetup y las instalo, ahi no hay problema.

¿Que debo corregir en mi aplicacion Servidor. o hacer alguna configuracion en el equipo Servidor?
¿debo cambiar la forma como mando a llamar los reportes?

Reporte generado en el servidor lo retorna en un arreglo de byte que será retornado al cliente que hizo la petición

byte[] genrep = new byte[10240];
        try{
            String template = System.getProperty("user.dir");
            String file_report = template+"/src/SanverReportes/Ventas/PrincipaReportesVentac.jasper";
            File archivo = new File(file_report);
            JasperReport reporte=null;
            reporte=(JasperReport) JRLoader.loadObject(archivo);  
            Map parametro = new HashMap();
            parametro.put("nomventa", numventa);
            parametro.put("ruta_dirrep_ventas", template+"/src/SanverReportes/Ventas/");
            genrep = JasperRunManager.runReportToPdf(reporte,parametro, conec.conx);
        }catch(HeadlessException | JRException e){            
             System.out.println(e);  
        }

...............................................................................................

En windows no hay problema si ejecuto el programa con doble clic..

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

sigh

OK primero lo más urgente: NO CORRAS EL PROCESO COMO ROOT. Es lo primero. Para ello, pues NO USES RUTAS ABSOLUTAS EN CODIGO DURO. Eso que haces de leer el directorio del usuario para pegarle lo de src está bien siempre y cuando la aplicación deba funcionar así, donde cada usuario tiene sus propios archivos.

Lástima que vienes a consultar ya que terminaste, porque te hubiera recomendado usar PostgreSQL en vez de mysql. Pero bueno, eso no es tan urgente. Aunque tal vez por ahí está el problema... mysql lo debes de correr como un proceso aparte y configurarlo para aceptar conexiones por TCP si es que está en otro equipo, o conexiones locales y pues configurar bien el URL, usuario y password en tu app para que se conecte al server de mysql.

Ni el cliente, ni el servidor deben correr como root.

Imagen de pechsclk

NO CORRAS EL PROCESO COMO ROOT

mysql esta configurado para aceptar peticiones remotas.
la aplicacion Serevidor tiene la facilidad de conectarse dinamicamente. no tiene la ruta absoluta para su
conexion con la base de datos.


http://sim1.subirimagenes.net/img/2015/07/28//150728073653514006.png

forma como se conecta la aplicacion Servidor con la base de datos
las aplicaciones cliente se conecta por medio de ip y puerto para localizar al servidor
ejemplo el servidor tiene la ip 192.168.1.240 y escucha por el puerto 1090.
los clientes necesitan estos datos para establecer la conexion con el servidor...

Ejecuta el programa desde la

Ejecuta el programa desde la línea de comandos y revisa lo que dicen los errores.

El problema está que cuando lo ejecutas como root tiene permisos de todo ( por eso no lo debes de correr como root) y no salen errores. Cuando lo corres con doble click no estás viendo los mensajes de error que te salen.

Es probable que hayas pegado los archivos también con root y aunque estén en el directorio del usuario no tienen permiso para leerlos (chmod, chwon etc. etc )

Hasta que veas los mensajes de error sabrás que está pasando realmente.

Imagen de pechsclk

Ejecuta el programa dese la linea de comandos

ya esta checado de que cuando antes de ejecutar el programa toda la carpeta le aplico en chmod -R 777 nombredelacarpeta
con que nomas ejecute el programa en la terminar pues funciona todos los reportes... aunque lo ejecute normal o como root
pero como decia que lo ejecute normal con doble click ya los reporter no me muestra..

Re: doble click

 

Cuando ejecutas el JAR utilizando dobleclick, el directorio de trabajo puede ser distinto a cuando ejecutas el JAR desde línea de comandos. Haz una prueba con:

JOptionPane.showMessageDialog(null, System.getProperty("user.dir"));

En tu código, imprimes la excepción con System.out. Pero, cómo decía Oscar, con dobleclick no puedes ver esa salida (a menos que sea redirigida). Tal vez quieras usar un archivo de registro (logging) para ir imprimiendo cada excepción o mensaje. Puedes utilizar log4j o similar.

Algo menos complicado, es mostrar la excepción en un diálogo, incluyendo opcionalmente el stack trace. No obstante, este tipo de mensajes no deben mostrarse al usuario, sino algo más “amigable”.


Pon tus reportes (los archivos .jasper) en un paquete de Java. Los cargas así (por ejemplo):

InputStream inputStream = ClassLoader.getSystemResourceAsStream("org/javamexico/test/resources/MinorityReport.jasper");
Map<String, Object> map = new HashMap<>();
...
array = JasperRunManager.runReportToPdf(inputStream, map, jrDataSource);

¡Espero ayude!

~~~

Imagen de pechsclk

Haz una prueba con

estube checando por partes y poniendo los mensajes de JOptionPane
y lo que no alcanza a mostrar es en el parametro que le paso como ruta_dir

el codigo completo del reporte esesto..

public byte[] responsiva_reimprimir_asignacion(String num_responsiva, Conexion con) throws IOException, DocumentException {
        conec = con;
        String template="";
        String file_report="";
       byte[] genrep = new byte[10240];
        try{                                    
            template = System.getProperty("user.dir");
            file_report = template+"/src/SanverReportes/Responsivas/ReimpResponsivaf.jasper";
            File archivo = new File(file_report);
            JasperReport reporte=null;
            reporte=(JasperReport) JRLoader.loadObject(archivo);  
            Map parametro = new HashMap();
            parametro.put("responsiva", num_responsiva);
            parametro.put("ruta_dir_reimprimir", template+"/src/SanverReportes/Responsivas/");
            JOptionPane.showMessageDialog(null, parametro.put("ruta_dir_reimprimir", template+"/src/SanverReportes/Responsivas/"));
            genrep = JasperRunManager.runReportToPdf(reporte,parametro, conec.conx);
        }catch(HeadlessException | JRException e){            
             System.out.println(e);  
        }
        return genrep;
    }

puse los JOptionPane.showMessageDialog(null, file_report); despues del System.getProperty("user.dir")
otro mas despues del segundo parametro que es la que esta de esta forma
 parametro.put("ruta_dir_reimprimir", template+"/src/SanverReportes/Responsivas/"); y este ultimo no logra capturar la ruta para los subreportes....
es mas como que los parametros no los toma en cuenta es ahi donde se pierde
y es ese problema de que mi reporte no lo muestre..
todos mi reportes ocupan subrerportes..
y como lo digo si lo ejecuto desde la terminal si funciona bien los reportes....

Si no ves las excepciones

Si no ves las excepciones solo vas a estar adivinando, lo cual no es nada eficiente si es que llega a ser efectivo.

Reemplaza todos los usos de System.out por un logger que escriba a un archivo (java.util.logger es ya viene incluído en Java) y usa archivos de propiedades para especificar valores en vez de estarlos leyendo o calculando.

# my app properties ( app.properties )
reports.dir=/home/tu/src
...
// En algun lugar donde se inicialice la aplicación:
Properties properties = new Properties();
properties.load(TuApp.class.getClassLoader().getResourceAsStream("app.properties"));

// Y luego sustituye System.getProperty por el archivo de propiedades
// template = System.getProperty("user.dir");
template = properties.getProperty("reports.dir");

Re: ruta para los subreportes

 

¡Ya me lo imaginaba! En Windows, System.getProperty("user.dir") te devuelve el directorio en el que se encuentra el JAR que estás ejecutando con doble clic. Pero en Linux no te regresa ese directorio.

Hay otra forma de obtener ese directorio. Lo único que necesitas es una clase dentro del JAR. Por ejemplo, la clase Main en el siguiente código:

String path = Main.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String template = path.replaceFirst("(?i)[\\\\/][^\\\\/]+\\.jar$", "");

~~~

Imagen de pechsclk

checando

Checando este es la ecepcion que manda. al momento de ejecutar la aplicacion Servidor.jar la cual el mismo programa si es ejecutado desde la terminal no ocurre dicho error;
de que el archivo no encontrado

  • http://sim1.subirimagenes.net/img/2015/07/29//150729043919514405.png
  • esto pasa con linux.
    porque el mismo programa se ejecuta normal en un entorno windows esto funciona si problemas...

    Re: checando

    Yup. System.getProperty("user.dir") te está regresando $HOME.

    Imagen de pechsclk

    tienes razon

    Tienes razon Jpaul ejecutando desde la terminal te da la ruta correcta en donde esta el jar...
    System.getProperty("user.dir");
    pero ya ejecutando normal con doble click ya la ruta lo da diferente
    /home/nombre_usuario
    y concatenando con la ruta sobrante que esta en la clase /src/reportes/reporte.jar ya no es la correcta..
    en cambio con esta linea de codigo
    Main.class.getProtectionDomain().getCodeSource().getLocation().getPath(); te da la ruta correcta ejecutando normal o con la terminal

    Gracias.. a todos.... por sus respuestas..

    style="display:inline-block;width:728px;height:90px"
    data-ad-client="ca-pub-5164839828746352"
    data-ad-slot="7563230308">