Maven
HAZ LA CONSTRUCCIÓN REPRODUCIBLE

* Especifica siempre una versión de los plugins Maven2
Modo incorrecto

<plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-surefire-plugin</artifactid>
</plugin>

Modo correcto

<plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-surefire-plugin</artifactid>
 <version>2.3</version>
 </plugin>

Esto importa porque si no pones la versión, maven2 utiliza por defecto la ULTIMA disponible.

Esto quiere decir que

  • el resultado del plugin puede ser impredecible si la implementación ha cambiado (características nuevas/eliminadas, …)
  • tu proyecto, sin saberlo, se convierte automáticamente en un beta-tester para plugins de terceros si la última versión es una SNAPSHOT

Las nuevas versiones de m2eclipse mostrarán una advertencia en la consola. Puede revisar también el plugin enforcer de maven.

* Minimiza el número de dependencias SNASPHOT

Está estrictamente NO recomendado el uso de versiones SNAPSHOT en las dependencias de tu proyecto ya que nunca garantiza que una versión SNAPSHOT esté disponible en cualquier repositorio. Esto puede derivar en los errores de construcción bien conocidos por dependencias no encontradas. Así que para proyectos que “no te pertenezcan”… es preferible utilizar versiones reales.

Cómo detectar si tienes una versión SNAPSHOT.

* Utiliza la sección de gestión de dependencias

La transitividad de dependencias es una gran característica… pero al final quieres estar seguro de la versión que usas y envías a producción.

La gestión de dependencias te permite consolidar y centralizar la gestión de las versiones de las dependencias sin añadir dependencias que son heredadas por todos los hijos. Esto es especialmente útil cuando tienes un conjunto de proyectos (esto es, más de uno) que heredan de un padre común.

Otro caso de uso de dependencyManagement extremadamente importante es el control de versiones de los artefactos utilizado en la dependencias transitivas. Esto es difícil de explicar sin un ejemplo. Afortunadamente, esto está ilustrado en la documentación.

	
    <dependencyManagement>
        <dependencies>
                 ...

* Preocúpate de la reubicación en el repositorio maven

Reubicar un artefacto es cambiar el “id maven” (groupId:artifactId) de un proyecto.


xstream:xstream
com.thoughtworks.xstream:xstream

Una trampa común en la reubicación maven es tener jars dobles incluso en la correcta utilización de dependencyManagement.

Utiliza el m2eclipse y sus vista de jerarquía de dependencias, para detectar y excluir los artefactos no deseados.

* Después de modificar una dependencia, comprueba los artefactos producidos

Un hábito saludable consiste en comprobar tu war/ear producido después de añadir una nueva dependencia o de actualizar una existente.

Dos buenas herramientas para ayudarte en esto son:

USA Y ABUSA DE LOS MÓDULOS

Los módulos pueden ser más “técnicos”

<modules>
  <module>mymodule_api</module> <!-- service interface, value objects, exception -->
  <module>mymodule_impl</module> <!-- service & dao implementation -->
  <module>mymodule_web</module> <!-- web components, controllers, templates.. -->
</modules>

o

Más orientados a “negocio”

	
<modules>
   <module>contract_modules</module>
   <module>finance_modules</module>
   <module>time_modules</module>
   <module>agenda_modules</module>
</modules>

HAZ LA CONSTRUCCIÓN MANTENIBLE

* Preferentemente usa la estructura de directorios por defecto

Esto hará la configuración de los plugins más sencilla:

src/main/java         Fuentes de aplicación/librería
src/main/resources    Recursos de aplication/librería
src/main/webapp       Recursos de aplicación Web (para el empaquetado war)
src/test/java         Fuentes de pruebas
src/test/resources    Recursos de pruebas

* Evita la duplicidad moviendo etiquetas comunes al pom padre

¿De verdad quieres tener que decir que compilas para la jrk 1.5 en todos tus proyectos?

	
    <!-- Use Java 1.5 -->
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>2.3.1</version>
       <configuration>
            <fork>${javacFork}</fork>
            <executable>${javacExecutable}</executable>
            <verbose>${javacVerbose}</verbose>
            <compilerVersion>${jdk.version}</compilerVersion>
            <source>${jdk.version}</source>
            <target>${jdk.version}</target>
        </configuration>
    </plugin>

¡muévelo a un pom padre!

por ejemplo, en

  corporate_base_pom  ->  app_basecom  ->       app_module1         -> app_sub_modules

    jdk 1.5               dependencias          dependencias                    
 repo empresarial           técnicas            de aplicación
                           (spring,...)         (app_module2,app_module3,..)

* Especifica siempre una versión de dependencias en un pom padre

Prefiere un lugar central para la definición de versiones.
No especifiques versiones un un sub-módulo específico.

* Utiliza properties con total libertad

Agrupa dependencias con properties… para evitar copiar/pegar la versión en todas partes y ayudar a la fácil actualización de versión.

Y muévelo a un pom padre.

	
<properties>
    <spring.version>3.0.0.RELEASE</spring.version>
</properties>
 
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
         <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
         <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
</dependencies>

* Minimiza el número de perfiles

Los perfiles puede ayudar mucho… pero inevitablemente complicarán el proceso.
Así que no añadas perfiles si por ejemplo añadiendo un nuevo proyecto con un ensamblado conseguiría el objetivo. Maven Profile Best Practices

  • La construcción se debe poder realizar cuando no se ha activado ningún perfil
  • Utiliza perfiles para adaptarte a contextos en tiempo de construcción, no contextos en tiempo de ejecución, y no (salvo raras excepciones) para producir versiones alternativas de tu arterfacto

Recuerda: El soporte para perfiles fuera del POM o settings.xml ha sido eliminado en Maven 3.x.

HAZ LA CONSTRUCCIÓN PORTABLE

* No hagas commit de artefactos eclipse y maven

Para simplificar el checkout… evita hacer commit de los siguientes ficheros y directorios


.project
.classpath
.settings
.wtpmodules
target

estos ficheros generalmente:

  • referencias configuraciones locales como nombre/paths de la JRE..
  • son específicos de una versión de plugins (wtp,…)

así que deja que m2eclipse los gestiones y mantenga/genere el .project, .classpath,…

ver Subversion and the importance of svn:ignore for MAVEN multi modules

* No modifiques pom/artefactos en tu repositorio “empresarial”

Siempre es una tentación el arreglar un pom o un jar en el repositorio central… no lo hagas.
Identifícalo como una versión especial en tu repositorio “artefact-1.0.5.corporatepath” o gestiona las exclusiones correctas.

ver Maven doesn’t suck, your POM does

vía

Ubuntu Thunderbird
Thunderbird se integra con el área de notificación de Unity (el gestor de ventanas por defecto de Ubuntu) de tal modo que si recibes un correo se pone en azul el icono con forma de sobre.

El problema es que este cambio de color no sucede con todos los correos sino que sucede únicamente si:

  • El mensaje ha sido enviado con prioridad alta O SI
  • El mensaje es etiquetado (por un filtro) O SI
  • El mensajes tiene como destinatario el receptor (esto es, no está en copia) Y el mensaje no tiene prioridad baja Y el mensaje no ha sido generado automáticamente Y el mensaje no procede de una lista de distribución

Pero a mi me interesa saber cuando me llega cualquier mensaje.

La forma de cambiar este comportamiento y que el icono se ponga azul al recibir cualquier mensajes pasa por crear la siguiente entrada booleana en about:config (Preferences –> Advanced –> General –> ConfigEditor) con valor true:

extensions.messagingmenu.attentionForAll

vía

Subversive Logo
Inicialmente tenía conectados en Eclipse varios proyectos con un SVN utilizando el plugin Subclipse.

Debido a unos problemas en la creación de patches, tuve que cambiar a Subversive.

El problema viene porque una vez eliminado el plugin de Subclise y añadido el de Subversive, la única opción que aparece al pulsar botón derecho sobre un proyecto –> Team, es “Apply Patch…

Esto es debido a que Eclipse “recuerda” que el proyecto estaba conectado al SVN usando Subclipse (que ya no está disponible) y no me permite volver a conectarlo usando Subversive.

Para solucionarlo tenemos dos opciones.

La primera opción (des-instalar/re-instalar los plugins):

  1. Des-instala Subversive
  2. Re-instala Subclipse
  3. Verifica que los proyectos están conectados al SVN
  4. Botón derecho sobre el proyecto –> Team –> Disconect. Asegúrate de marcar “Do not delete the SVN meta-information (e.g. .svn subdirectories).
  5. Des-instala Subclipse
  6. Re-instala Subversive
  7. Botón derecho sobre el proyecto –> Team –> Share Proyect…

La segunda opción (si no quieres des-instalar/re-instalar):

  1. Crea un nuevo workspace vacío
  2. Abre Eclipse utilizando dicho workspace
  3. File –> Import –> General –> Existing Projects into Workspace
  4. Selecciona el proyecto del viejo workspace
  5. Botón derecho sobre el proyecto –> Team –> Share Proyect…

vía

db2
SquirrelSQL es una estupenda herramienta para trabajar con bases de datos.  Sin embargo, he tenido algún problema ejecutando consultas contra bases de datos DB2.  Cuando una consulta contenía un problema de sintaxis (o se encontraba cualquier otro error durante su ejecución), solamente me mostraba el Código de Error SQL, no el mensaje de texto comprensible por un ser humano.

Pero existe un sencillo modo de solucionar este problema:

En el alias de conexión, se debe añadir la propiedad:
  retrieveMessagesFromServerOnGetMessage=true

jdbc:db2://<server>:<port>/<db-name>:retrieveMessagesFromServerOnGetMessage=true;

Extracto del DB2 infocenter:

If you want full message text from a data server when you execute SQLWarning.getMessage calls, set the retrieveMessagesFromServerOnGetMessage property to true.

vía

Eclipse Logo
Las últimas versiones de Eclipse han cambiado el modo que tenían de tratar las pestañas de edición.

En Indigo, cuando tenías 10 pestañas abiertas:

A | B | C | D | J | H | G ….(F | T | S)

y estabas posicionado en la B, al seleccionar de nuevo el fichero mostrado en la pestaña T, esta pestaña (al contrario de lo que ocurre en las últimas versiones) se reposicionaba para quedar al lado de la última abierta, es decir:

A | B | T | C | D | J | H ….( G | F | S)

Esto es útil ya que, si abrimos T después de B, tiene sentido que se agrupen juntas.

En Juno y Kepler no se reposicionan y en vez de eso tienes que buscar los ficheros más recientes al final de la lista de pestañas.

Para modificar este comportamiento (y volver al funcionamiento anterior) hay que editar las hojas de estilo que se encuentran en INSTALL/plugins/org.eclipse.platform_<<version>>/css y modificar el estilo:


.MPartStack {
swt-mru-visible: true;
}

vía

Algunos enlaces de interés
Eclipse4/CSS

WebSphere software
Al intentar instalar un antiguo WebSphere 7.0 en un sitema con Mozilla Firefox 10+ como navegador por defecto, ejecutando el IBM Launchpad usando el script launchpad.she, aparece el siguiente mensaje:

An error occurred while starting the launchpad. This error typically occurs when
the launchpad is unable to find a supported browser. Check your product’s
documentation for a list of supported browsers.

El problema está en que las versiones soportadas de Firefox para esta versión de launchpad se limitan a las veriones 1 a 9. Afortunadamente existe algún “apaño” para soportar versiones superiores.

Según se indica en http://www-01.ibm.com/support/docview.wss?uid=swg21595098 podemos modificar el script launchpad\browser.sh de tal modo que la función supportedFirefoxVersion() quede tal que así:

browser.sh Línea 22:

supportedFirefoxVersion()
{
case "$*" in
*Firefox\ [1-9].*) return 0;;
*Firefox/[1-9].*) return 0;;
*Firefox\ [1-9][0-9].*) return 0;;
...

Una vez modificado este fichero, al intentar arrancar la aplicación IBM Launchpad ejecutando el comando launchad.sh en un sistema cuyo navegador por defecto es un Mozilla Firefox 15+, puedes recibir el siguiente mensaje de error en el navegador:

Unable to find supported browser

An error occurred while starting the launchpad. This error typically occurs when the launchpad is unable to find a supported browser. Check your product’s documentation for a list of supported browsers.
NOTE: This file is a place holder for product specific instructions about how to recover from this error.
You should describe the location of installation programs on the product CD so the user can run them directly without starting launchpad if necessary.
Procedure for correcting the error that is preventing the launchpad from displaying
==============================================================
The launchpad supports the following browsers:
o Mozilla
o Firefox
o Internet Explorer (Microsoft Windows platforms only)
o SeaMonkey

Con un poco de investigación, verás que la variable whichBrowser en el script launchpad\browser.sh (invocado por launchpad.sh) se fija correctamente (con la modificación anterior), y que tu navegador se abre con el siguiente comando:

/usr/bin/firefox -P Profile_2883 -profile /tmp/IBM_LaunchPad_2883/Profile_2883 file:///media/sf_websphere_media/media_80/wp_package/Setup/launchpad/Mozilla.html

Esto, inmediatamente te redirige a file:///media/sf_websphere_media/media_80/wp_package/Setup/launchpad/en/noBrowser.html – puede que ni siquiera notes que la redirección ocurre, lo que puede ser frustrante.

Lo que ocurre es que el fichero javascript “Mozilla.js” (llamado desde “Mozilla.html“) está intentando hacer una llamada a netscape.security.PrivilegeManager.enablePrivilege, que ya no está soportada por Firefox. Esto lanza un error javascript, que produce la redirección.

Mozilla.js Línea 42:

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

El soporte para enablePrivilege ha sido eliminado de Firefox (Bug 546848), de modo que ya no es posible obtener privilegios especiales usando este método.

Para más detalles sobre este cambio en Firefox, revisa la siguiente nota de soporte: http://support.mozilla.org/en-US/questions/944433

Siguiendo las indicaciones de http://www-01.ibm.com/support/docview.wss?uid=swg21643517 y si nuestra versión de Firefox es la 15 o la 17, podemos solucionar el problema editando el fichero launchpad\firefox.sh de tal modo que quede algo así:

firefox.sh Línea 57:

echo 'user_pref("capability.principal.codebase.p0.granted", "UniversalXPConnect UniversalBrowserWrite");' >$userprefpath/user.js
echo 'user_pref("capability.principal.codebase.p0.id", "'${LaunchPadURL}'");' >>$userprefpath/user.js
echo 'user_pref("browser.frames.enabled", true);' >>$userprefpath/user.js
echo 'user_pref("browser.shell.checkDefaultBrowser", false);' >>$userprefpath/user.js
echo 'user_pref("javascript.enabled", true);' >>$userprefpath/user.js
echo 'user_pref("security.fileuri.origin_policy", 4);' >>$userprefpath/user.js
echo 'user_pref("security.enable_java", false);' >>$userprefpath/user.js
echo 'user_pref("security.xpconnect.plugin.unrestricted", true);' >>$userprefpath/user.js
echo 'user_pref("update_notifications.enabled", false);' >>$userprefpath/user.js
echo 'user_pref("security.warn_entering_secure", false);' >>$userprefpath/user.js
echo 'user_pref("security.warn_leaving_secure", false);' >>$userprefpath/user.js
echo 'user_pref("security.warn_entering_weak", false);' >>$userprefpath/user.js
echo 'user_pref("security.warn_viewing_mixed", false);' >>$userprefpath/user.js
echo 'user_pref("security.warn_submit_insecure", false);' >>$userprefpath/user.js
echo 'user_pref("signon.rememberSignons", false);' >>$userprefpath/user.js
echo 'user_pref("browser.bookmarks.added_static_root", true);' >>$userprefpath/user.js
echo 'user_pref("intl.charsetmenu.browser.cache", "ISO-8859-1");' >>$userprefpath/user.js
echo 'user_pref("browser.search.opensidebarsearchpanel", false);' >>$userprefpath/user.js
echo 'user_pref("dom.allow_scripts_to_close_windows", true);' >>$userprefpath/user.js
echo 'user_pref("dom.disable_open_during_load", false);' >>$userprefpath/user.js
echo 'user_pref("nglayout.initialpaint.delay", 0);' >>$userprefpath/user.js
echo 'user_pref("browser.link.open_external", 2);' >>$userprefpath/user.js
echo 'user_pref("security.fileuri.strict_origin_policy", false);' >>$userprefpath/user.js
echo 'user_pref("browser.EULA.3.accepted", true);' >>$userprefpath/user.js
echo 'user_pref("browser.EULA.4.accepted", true);' >>$userprefpath/user.js
echo 'user_pref("browser.EULA.5.accepted", true);' >>$userprefpath/user.js
echo 'user_pref("security.enablePrivilege.enable_for_tests", true);' >>$userprefpath/user.js
...

En caso contrario, para solventar el problema, tendremos que instalar una versión antigua de Firefox. Puedes encontrar versiones antiguas de Firefox aquí: https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/

NOTA: Puede ser necesario establecer la variable de entorno que indica el navegador a utilizar, del siguiente modo:
export BROWSER=/usr/lib64/firefox

vía

Eclipse Security
La contraseña maestra (masster password) de Eclipse es un poco “coñazo“. Afortunadamente podemos deshabilitar completamente esta característica. Lo primero es cerrar el Eclipse. Ahora podemos seguir estos pasos:

  1. Borra la seguridad equinox

    rm -rf ~/.eclipse/org.eclipse.equinox.security

  2. Establece una contraseña maestra en un fichero de texto

    Por ejemplo, yo utilizo “secret” como mi contraseña maestra del siguiente modo:

    echo "secret" > ~/.eclipse/master

  3. Edita el eclipse.ini

    Añade esto al principio de tu eclipse.ini

    -eclipse.password
    /home/user/.eclipse/master

    NOTA: Acuérdate de cambiar “/home/user” de acuerdo a tu nombre de usuario.
    NOTA 2: Debes escribirlo tal cual, en dos líneas. No lo puede poner en una sola línea.

Ya puedes arrancar tu Eclipse y no volverás a ver el “fastidioso” pop-up que te pregunta la contraseña maestra.

vía

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: