Maven – ¿Porqué necesito un administrador de repositorios?
octubre 28, 2011
Sin duda puedes utilizar Maven sin un administrador de repositorios. Pero esto sólo lo recomiendo si eres un programador solitario, no cuando formas parte de un equipo de desarrollo. Pero esta pregunta ya fue respondida en el sitio de Maven, así que sólo pondré aquí la traducción.
¿Porqué necesito un administrador de repositorios?Los administradores de repositorios de Maven cumplen 2 propósitos: actúan como intermediarios altamente configurables entre tu organización y los repositorios públicos de Maven y también proveen a una organización con un contenedor para sus propios artefactos generados.
Usar un intermediario a un repositorio de Maven tiene ciertos beneficios. Intermediar acelera la compilación a lo largo de tu organización al instalar una copia local de todos los artefactos del repositorio central de Maven. Si un desarrollador en tu organización necesita descargar la versión 2.5 del Spring Framework y utilizas un administrador de repositorios; las dependencias (y las dependencias de las dependencias) necesitan ser descargadas del repositorio remoto sólo una vez. Con una conexión a Internet de alta velocidad esto no es una preocupación, pero si constantemente le pides a tus desarrolladores que descarguen cientos de megabytes de dependencias de terceros, los ahorros reales serán el tiempo que le toma a Maven buscar nuevas versiones de las dependencias y el tiempo para descargarlas. Proveer las dependencias de Maven desde un repositorio local puede ahorrarte cientos de solicitudes a través de HTTP, y, en la compilación de proyectos muy grandes y complejos, puede ahorrarte minutos.
Si tu proyecto confía en cierto número de dependencias de tipo SNAPSHOT, Maven necesita verificar si hay actualizaciones de estas dependencias. Dependiendo de la configuración de tus repositorios remotos, Maven buscará actualizaciones de estos SNAPSHOTS periodicamente, o incluso pudiera estar buscando actualizaciones cada que compilas. Cuando Maven busca actualizaciones necesita interrogar al repositorio remoto acerca de la última versión del SNAPSHOT. Dependiendo de tu conexión a Internet y la carga en el repositorio central de Maven, este proceso de actualización puede agregar segundos al tiempo de compilación por cada SNAPSHOT. Cuando tienes un administrador de repositorios local actuando como intermediario, tu administrador de repoistorios va a buscar actualizaciones de los SNAPSHOTS de forma regular y programada, y tu aplicación será capaz de interactuar con el repositorio local. Si desarrollas software que depende de varios SNAPSHOTS, utilizar un administrador de repositorios localmente muchas veces puede reducir minutos al tiempo de compilación de un proyecto grande y complejo, la búsqueda de actualizaciones en el repositorio central que toma entre 5 y 10 segundos se va a ejecutar en milisegundos.
Además de los simples ahorros en tiempo y ancho de banda, un administrador de repositorios provee a una organización con el control sobre lo que es descargado por Maven. Puedes incluir o excluir artefactos específicos del repositorio público, y el tener este nivel de control sobre lo que es descargado desde el repositorio central de Maven es un prerequisito para las organizaciones que necesitan un estricto control sobre las dependencias que son usadas a lo largo y ancho de la organización. Una organización que quiere establecer un estándar sobre una versión específica de una dependencia como Hibernate o Spring puede asegurarse de que se cumpla este estándar al sólo proveer acceso a una versión específica de un artefacto en el administrador de repositorios. Otras organizaciones pudieran estar preocupadas de asegurarse que todas las dependencias externas tengan una licencia compatible con las normas legales de esa organización. Si una corporación produce una aplicación que será distribuida, tal vez quiera asegurarse de no agregar desapercibidamente una dependencia a una librería de terceros que este cubierta por una licencia de tipo copy-left como GPL. Los administradores de repositorios proveen el nivel de control que una ogranización necesita para asegurarse que la arquitectura y políticas sean seguidas.
Ademas de los beneficios de mediar el acceso a los repositorios remotos, un administrador de repositorios ha probado ser escencial para la completa adopción de Maven. A menos que esperes que cada miembro de tu organización descargue y compile todos y cada uno de los proyectos internos, querrás proveer a los desarrolladores y departamentos de un mecanismo para compartir los artefactos de proyectos internos tanto SNAPSHOTS como versiones finales. Un administrador de repositorios de Maven provee a tu organización de dicho mecanismo. Una vez que instalas un administrador de repositorios de Maven, puedes comenzar a utilizar Maven para colocar tus snapshots y releases en un repositorio personalizado manejado por el administrador de repositorios. Con el tiempo, este contenedor central de proyectos internos se convierte en la estructura para la colaboración entre diferentes equipos de desarrollo.
También vale la pena mencionar el siguiente párrafo que encontré en uno de los libros de Sonatype, en la sección de agregar un repositorio a un grupo:
… te has encontrado con una situación en la que necesitas agregar dos repositorios a un proyecto para que se descarguen dos librerías (Google Caja and Google OAuth) que no están disponibles en el repositorio central de Maven. Si no utilizaras un administrador de repositorios, tendrías que agregar estos repositorios en la sección correspondiente del archivo POM del proyecto, ó tendrías que pedirle a todos tus desarrolladores que modificaran su archivo ~/.m2/settings.xml para hacer referencia a los dos nuevos repositorios. En lugar de eso, utilizaste el administrador de repositorios Nexus para agregar los dos repositorios al grupo público. Si todos los desarrolladores tienen la configuración para usar el grupo público de Nexus, puedes modificar o agregar nuevos repositorios sin tener que pedirle a tus desarrolladores que modifiquen su configuración, y además has obtenido cierto control sobre los repositorios que pudieran ser utilizados por tu equipo de desarrollo.
Fuentes:
http://maven.apache.org/repository-management.html
http://www.sonatype.com/books/nexus-book/reference/maven-sect-adding-to-group.html
Ubuntu 11.10 – Establecer variables de ambiente
octubre 25, 2011
No puedo creer que algo tan simple -o tal vez no- como establecer variables de ambiente sea tan complicado en Ubuntu. Antes, cuando querías agregar una variable simplemente agregabas una línea como la siguiente en el archivo ~/.bash_profile
export M2_HOME=/home/cirovladimir/Apps/maven/apache-maven-3.0.3
Incluso podías, sin tener que reiniciar, actualizar las variables ejecutando dicho archivo (sh ~/.bash_profile).
Pues en Ubuntu 11.10 esto ya no funciona, lo he intentado sin éxito.
Por el momento la única forma que he encontrado es agregarlas en el archivo /etc/environment. Por supuesto, y lo que me molestó, es que necesitas privilegios de Administrador -sudo- además de que no puedes especificar el valor de las variables en base a otras, es decir, PATH=$PATH:$M2 no esta permitido (si no me crees, intentalo, pero una vez que reinicié ya no entró en la sesión gráfica :X). Por lo que deberás definir las variables de forma explícita. Por cierto, para que los cambios surtan efecto debes reiniciar tu sesión.
Por ejemplo:
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/cirovladimir/Apps/maven/apache-maven-3.0.3/bin”
M2_HOME=/home/cirovladimir/Apps/maven/apache-maven-3.0.3
M2=/home/cirovladimir/Apps/maven/apache-maven-3.0.3/bin
en vez de
M2_HOME=/home/cirovladimir/Apps/maven/apache-maven-3.0.3
M2=$M2_HOME/bin
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$M2″
Fuentes:
https://help.ubuntu.com/community/EnvironmentVariables
http://wobblycogs.co.uk/index.php/computing/linux/55-installing-maven-on-ubuntu-1110
Linux – Instalar diferentes versiones de firefox
octubre 21, 2011
Ya sea que eres nostalgico, diseñador o desarrollador web seguramente haz tenido la necesidad de ejecutar una versión diferente a la que tienes instalada. En mi caso, la extensión GWT Developer Plugin -utilizada para depurar aplicaciones hechas con GWT- solo es compatible con las versiones 3.0 a la 6.0 (a la fecha) y tengo la 7.0 :S
Para instalar otras versiones hay que descargar -desde el servidor FTP de mozilla- y descomprimir en una carpeta las que necesitemos.

Una vez hecho esto tenemos que crear un nuevo perfil por cada versión que deseamos utilizar con el siguiente comando (cada perfil tendrá su propia carpeta en el directorio ~./mozilla/firefox)
firefox -no-remote -CreateProfile firefox-3.6.20
Puedes ver la configuración de los perfiles en el archivo ~./mozilla/firefox/profiles.ini
Listo, ya solo tienes que ejecutar la versión de firefox desde su carpeta
cd firefox-3.6.20
./firefox -no-remote -P firefox-3.6.20

No olvides desactivar las actualizaciones de firefox

También puedes crear un acceso directo en tu escritorio dando clic derecho y seleccionar “Create Launcher…”

Fuentes:
BIRT – Publicar tus reportes en JBoss
octubre 11, 2011
Para publicar los reportes creados con BIRT en un servidor de aplicaciones no hay nada más fácil que utilizar el Report Viewer. En JBoss AS7 es tan sencillo como copiar el archivo birt.war -que viene con el BIRT Runtime- en el directorio {$as7home}/standalone/deployments, abrir el archivo birt.war y agregar el reporte que deseas.


Una vez hecho esto, abres el navegador y accedes a http://localhost:8080/birt/frameset?__report=rptSentenciasPendientes.rptdesign
Obviamente tienes que cambiar el parámetro “__report” por el nombre de tu reporte. Listo, ya deberías ver tu reporte!
En mi caso me arrojaba el error
org.eclipse.birt.report.engine.api.EngineException: Can not load the report query: 104. Errors occurred when generating the report document for the report element with ID 104. (Element ID:104)
at org.eclipse.birt.report.engine.data.dte.DataPresentationEngine.doExecuteQuery(DataPresentationEngine.java:160)
at org.eclipse.birt.report.engine.data.dte.AbstractDataEngine.execute(AbstractDataEngine.java:267)
at org.eclipse.birt.report.engine.executor.ExecutionContext.executeQuery(ExecutionContext.java:1905)
Supe entonces que había un problema al ejecutar una consulta. Recordé que los datos provienen de una base de datos de Oracle y por lo tanto necesitaba colocar el controlador de la base de datos, ojdbc6.jar, en el directorio WEB-INF/lib.

Con ello los errores desaparecieron y el reporte se generó correctamente.
Maven – Depurar Servicios Web Apache CXF en Eclipse
octubre 10, 2011
Primero vamos a crear un servicio web (SOAP) utilizando Apache CXF. Necesitas tener instalado m2eclipse -ya viene con Eclipse Indigo- y m2e-wtp
Creamos un nuevo proyecto de Maven

Seleccionamos el arquetipo
Establecemos las coordenadas de Maven
Nos queda un proyecto de la siguiente manera
Para probarlo, abrimos el archivo pom.xml y agregamos el plugin “jetty-maven-plugin“
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.0.1.v20110908</version>
</plugin>
Ahora podemos ejecutarlo dando clic en el proyecto y luego en “Run As…->Maven build…”, pon “jetty:run” en Goals
Al final, verás en la consola un texto como el siguiente
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1f60f2b: defining beans []; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@16d8a64
Oct 10, 2011 3:59:37 PM org.apache.cxf.transport.servlet.AbstractCXFServlet replaceDestinationFactory
INFO: Servlet transport factory already registered
2011-10-10 15:59:37.112:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080 STARTING
[INFO] Started Jetty Server
Abre tu navegador y ve a http://localhost:8080
Si das clic en el enlace que te muestra podrás ver el WSDL del servicio web. Puedes probar el servicio con una herramienta como SoapUI o el WSDL Explorer de Eclipse.
Bueno, pues ahora lo importante de este artículo, ¿cómo podemos depurar el código de los servicios web? Y con depurar me refiero a establecer breakpoints, examinar variables, ejecutar línea por línea, etc.
Tienes que abrir una consola -no pude hacerlo directamente en Eclipse- e ir al directorio de tu proyecto, una vez ahí, ejecuta el comando
mvnDebug jetty:run
deja abierta la consola y regresa a Eclipse. Da clic derecho en tu proyecto y luego en “Debug As…->Debug Configurations…”. Da clic derecho en “Remote Java Application” y selecciona “New”
deja los valores por default y da clic en Debug. Establece un breakpoint en el código generado e invoca el servicio, verás como la ejecución se detiene y podrás examinar las variables

Fedora 15 – Convertir imágenes RAW a JPEG
octubre 6, 2011
Estoy muy feliz porque nos entregaron las fotografías de nuestra boda. Sin embargo, algunas imágenes estaban en formato RAW. El visor por default en Fedora 15, Shotwell 0.10.1, no puede abrir este tipo de imágenes. Intenté con Eye fo GNOME 3.0.1 y GIMP pero tampoco tuve éxito.
Para poder abrir las imágenes en GIMP puedes instalar el plugin ufraw


Pero lo que nosotros necesitabamos era convertir unas 1,434 fotografías de RAW a JPEG :-S
Lo bueno es que existe un programa llamado DCRAW que puedes ejecutar desde la línea de comandos para convertir una imagen. Por default convierte las imágenes al formato PPM, pero también existen otras utilidades -Netpbm- para convertir de PPM a JPEG
Bueno, pues lo primero es instalar DCRAW

luego instala Netpbm

ahora si, en una terminal ve al directorio donde tienes las imágenes y ejecuta el siguiente comando
for i in *.CR2; do dcraw -c -a -h $i | ppmtojpeg > `basename $i CR2`JPEG; echo $i done; done
asegurate de poner correctamente la extensión de los archivos -CR2 en el caso de las cámaras Canon- y recuerda que Linux es sensible a minúsculas y mayúsculas
Fuentes:
http://ocaoimh.ie/2005/09/18/converting-raw-to-jpeg-in-linux/
http://www.cybercom.net/~dcoffin/dcraw/dcraw.1.html
Maven – m2eclipse renombrar modulo
octubre 5, 2011
Estoy creando un proyecto que contiene varios módulos. Pues quise renombrar uno mediante “Refactor->Rename…” pero, desafortunadamente, solo cambia el nombre del proyecto -no actualiza el archivo pom.xml, la carpeta del proyecto, ni el artifactId-
Encontré que existe una opción, “Refactor->Maven Rename…” pero sólo funciona para proyectos y no para módulos, aunque con un poco de trabajo podemos utilizar esta opción para renombrar un módulo.
Selecciona el archivo pom.xml del módulo a renombrar y da clic en “Refactor->Maven Rename…”. Cambia el campo Artifact Id por el nuevo nombre y selecciona la casilla de “Rename Eclipse project in Workspace”.


Modifica el archivo pom.xml del padre de acuerdo al nuevo nombre del módulo

Renombra la carpeta del módulo dentro del padre. Al hacer esto, el módulo desaparece. No te preocupes, más adelante lo vamos a reimportar

Finalmente hay que reimportar el proyecto padre y seleccionar solo el pom del módulo renombrado


Fuentes:
https://docs.sonatype.org/
http://maven.40175.n5.nabble.com/Restore-import-existing-module-td139795.html

