El asunto con /usr/lib/jvm/default-jvm

Probando Intellij IDEA tuve un problema ejecutando una app Maven, al parecer mi maven seguía tratando de ejecutarse usando el viejo JDK 1.6 y no el 1.7 configurado con sudo updade-alternatives –config java sucede que maven usa la variable JAVA_HOME y ésta se encuentra configurada para apuntar a /usr/lib/jvm/default-jvm que es un enlace al jdk por defecto del sistema. Solución, cambiar el destino del enlace (reemplazar jdk_name con el nombre de un jdk listado con el primer comando).

sudo update-java-alternatives -l
sudo update-java-alternatives -s jdk_name
sudo unlink /usr/lib/jvm/default-java
sudo ln -s /usr/lib/jvm/jdk_name /usr/lib/jvm/default-java
Anuncios

#Bitbucket y repositorios #Maven

Generalmente cuando se hace algún tipo de libreria en Java se empaqueta en un artefacto .jar, para gestionar el ciclo de construcción de una aplicación (entre ellas la gestión de dependencias) se puede usar Maven u otra herramienta similar (ant, ivy, gradle).

Ahora bien para publicar los artefactos al equipo y dejarlos disponibles se puede usar un ftp, dav o un gestor completo como Artifactory o Nexus, sin embargo con soluciones como Bitbucket o Github es buena idea mantener todo junto (más aún si Bitbucket permite repositorios privados tanto en Mercurial como en Git).

Para ello simplemente tenemos que configurar en el pom.xml de nuestro proyecto para que haga un deploy local del artefacto y luego publicarlo en bitbucket (git) mediante el ciclo commit , push. Finalmente cuando se necesite usar la dependencia en otro proyecto solo hay que agregar la configuración de repositorios para descargar la dependencia. Por ahora un pom.xml de ejemplo:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.simmetrics</groupId>
  <artifactId>simmetrics</artifactId>
  <version>1.6.2</version>
  <packaging>jar</packaging>

  <name>simmetrics</name>
  <description>SimMetrics is a Similarity Metric Library, based on previous work by http://sourceforge.net/projects/simmetrics/</description>
  <url>https://bitbucket.org/Nickmancol/simmetrics</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <altDeploymentRepository>releases::default::${project.baseUri}/mavenRepo/releases/</altDeploymentRepository>
  </properties>
  
  <developers>
    <developer>
      <id>@Nickmancol</id>
      <name>Nicolas Bohorquez Gutierrez</name>
      <email>nicolas.bg@gmail.com</email>
      <timezone>America/Bogota</timezone>
    </developer>
  </developers>

  <scm>
    <connection>scm:hg:http://bitbucket.org/Nickmancol/simmetrics</connection>
    <developerConnection>scm:hg:http://bitbucket.org/Nickmancol/simmetrics</developerConnection>
    <url>http://bitbucket.org/Nickmancol/simmetrics</url>
  </scm>
  
  <distributionManagement>
	  <repository>
      <id>releases</id>
      <url>https://bitbucket.org/Nickmancol/simmetrics/raw/tip/mavenRepo/releases/</url>
	  </repository>
	  <snapshotRepository>
	  	<id>snapshots</id>
      <url>https://bitbucket.org/Nickmancol/simmetrics/raw/tip/mavenRepo/snapshots/</url>
	  </snapshotRepository>
  </distributionManagement>

	<build>
    <plugins>
    	<plugin>
	      <groupId>org.apache.maven.plugins</groupId>
	      <artifactId>maven-compiler-plugin</artifactId>
	      <version>2.3.2</version>
	      <configuration>
	        <source>1.5</source>
	        <target>1.5</target>
	      </configuration>
	    </plugin>
	    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
		</plugins>
  </build>
	
	<profiles>
		<profile>
			<id>deploy-snapshot</id>
			<properties>
				<altDeploymentRepository>snapshots::default::${project.baseUri}/mavenRepo/snapshots</altDeploymentRepository>
			</properties>
		</profile>
	</profiles>
	
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
    </dependency>
  </dependencies>
</project>

Corresponde a un proyecto para actualizar una librería para el cálculo de similitud entre dos cadenas de texto usando diferentes métricas, originalmente publicada en sourceforge (CVS) sin mantenimiento desde hace 5 años.

En las lineas 34 a 43 se declaran los repositorios para distribución del artefacto. En la linea 16 se declara la propiedad altDeploymentRepository que sobreescribe la publicación del artefacto en el repositorio por una ruta local directorio del proyecto/mavenRepo/releases cuando se ejecuta la tarea de maven deploy. Finalmente en las lineas 82 a 89 se declara un profile para sobreescribir la propiedad altDeploymentRepository cuando se hace deploy de un snapshot.

Hibernate, Spring, cglib y maven

Actualizando las dependencias de un proyecto a Hibernate 3.3.2 (en espera de la versión 3.5) me encontré con que hay algunas cuestiones a tener en cuenta, la primera es que desde hace un par de versiones Hibernate reemplazó cglib por javassist (que es mas lento):

  1. Los releases de Hibernate se publican en el repositorio maven de repository.jboss.org/maven2
  2. Para hacer disponible un repositorio en sonatype nexus no solo es necesario crearlo sino que hace falta insertarlo en el listado de repositorios públicos
  3. Las dependencias de Hibernate para usar cglib como bytecode provider incluyen:
    <!-- Hibernate -->
    	<dependency>
    	   <groupId>org.hibernate</groupId>
    	   <artifactId>hibernate-core</artifactId>
    	   <version>${hibernate.version}</version>
    		<exclusions>
    		  <exclusion>
    		      <groupId>asm</groupId>
    		      <artifactId>asm</artifactId>
    		  </exclusion>
    		  <exclusion>
    		      <groupId>asm</groupId>
    		      <artifactId>asm-attrs</artifactId>
    		  </exclusion>
    		</exclusions>
    	</dependency>
    	<dependency>
    	    <groupId>org.hibernate</groupId>
    	    <artifactId>hibernate-annotations</artifactId>
    	    <version>${hibernate.annotations.version}</version>
    	</dependency>
    	<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
    	
    	<!-- Bytecode -->
    	<dependency>
    		<groupId>cglib</groupId>
    		<artifactId>cglib-nodep</artifactId>
    		<version>${cglib.version}</version>
    	</dependency>
    
  4. La versión de hibernate es 3.3.2.GA, la de hibernate-annotations es 3.4.0.GA la de cglib es 2.2
  5. Es necesario crear el archivo hibernate.properties con una propiedad hibernate.bytecode.provider=cglib en la raíz del classpath (no sirve configurarlo mediante la propiedad hibernateProperties de la configuración de spring del sessionFactory)

De esta manera se actualiza correctamente Hibernate, se evade la dependencia (viejisima) de ehcache 1.2.3 y se pueden usar anotaciones además de archivos de mapeo.