Compilacion nativa de codigo Java Febrero 23, 2007
Posted by superpiwi in Java.trackback
Hace unos cuantos meses que intente compilar nativamente una aplicacion que se conectaba a una base de datos Oracle mediante gcj
http://gcc.gnu.org/java/
Pero desisti, porque me daba problemas el driver de conexion de Oracle y la solucion era compilarlo nativamente (por entonces no tenia tiempo y lo cierto es que ahora tampoco, y lo deje aparcado). Pero el otro dia decidi echar otro vistazo y me alegro saber que ya estaba soportado.
Asi que corriendo me instale la nueva version de gcc (incluyendo gcj). Cuya instalacion comente en otro post.
Vamos al tema. Como ejemplo voy a compilar nativamente una clase que implemente hace tiempo para copiar datos entre tablas. Esta formada por 2 clases “DatabaseUtil.java” y “Migracion.java”. mas detalles sobre estas clases en el siguiente post:
copiar tablas entre bases de datos
el comando para compilar a ejecutable nativamente es el siguiente:
gcj –main=Migracion -o migrar DatabaseUtil.java Migracion.java
(ojo son 2 guiones –main)
se nos genera un ejecutable con el nombre “migrar” (por la opcion -o de output)
si comprobamos el tipo de fichero:
/export>file migrar
migrar: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
Si queremos ejecutarlo, nos aseguramos de tener en la variable de entorno LD_LIBRARY_PATH las librerias necesarias, para ello hacemos:
export LD_LIBRARY_PATH=/usr/local/lib
El comando “ldd” nos permite ver las librerias que necesitamos para que funcione:
/export/gcj > ldd migrar
/etc/libcwait.so => /etc/libcwait.so (0xb75e7000)
libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0xb75dc000)
libgcj.so.7 => /usr/local/lib/libgcj.so.7 (0xb60eb000)
libm.so.6 => /lib/tls/libm.so.6 (0xb60bc000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb60ac000)
libdl.so.2 => /lib/libdl.so.2 (0xb60a9000)
libc.so.6 => /lib/tls/libc.so.6 (0xb5f71000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb75eb000)
En otro caso a la hora de ejecutar nos saltaria un mensaje de error indicando que no encuentra tal o cual libreria.
Otra cosa, al ejecutar nos dara un error de ClassNotFoundException:
./migrar -file migrar.cnf -verbose
[Migracion] [main] : activado trazas del proceso (verbose)
[Migracion] [imprimirParametros] : SOURCE_DRIVER: oracle.jdbc.driver.OracleDriver
[Migracion] [imprimirParametros] : TARGET_DRIVER: oracle.jdbc.driver.OracleDriver
[Migracion] [migrar] : @obtener conexiones
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
Para solucionarlo indicamos en el CLASSPATH la ruta al driver Jdbc utilizado:
export CLASSPATH=./ojdbc14_g.jar
Ahora ya funciona correctamente:
[Migracion] [migrar] : @obtener conexiones
[Migracion] [migrar] : conexion origen:oracle.jdbc.driver.OracleConnection@53ded8
[Migracion] [migrar] : conexion destino:oracle.jdbc.driver.OracleConnection@53de10
[Migracion] [migrar] : @Procesar tablas
[Migracion] [migrar] : Procesando tabla:SMT_APPLICATION…
[DatabaseUtil] [copyTable] : creando conexion con el origen…
[DatabaseUtil] [copyTable] : creando origen creada…
[DatabaseUtil] [copyTable] : creando conexion con el destino…
Genial!!!. ya podemos desarrollar aplicaciones java con acceso a base de datos y compilarlas de manera nativa en nuestra plataforma.
[...] Si te gusta el tema y quieres ver mas. mira: Compilacion nativa de codigo Java [...]