<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Justo Aguilar &#187; maven</title>
	<atom:link href="http://blog.justoaguilar.com/tag/maven/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.justoaguilar.com</link>
	<description>Libros, Java y lo que surja.</description>
	<lastBuildDate>Sun, 22 Jan 2012 14:26:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Configuración Equinox, OSGi, Spring DM y Maven</title>
		<link>http://blog.justoaguilar.com/2009/07/configuracion-osgi-spring-dm-y-maven/</link>
		<comments>http://blog.justoaguilar.com/2009/07/configuracion-osgi-spring-dm-y-maven/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 22:00:17 +0000</pubDate>
		<dc:creator>justo</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[profesional]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[equinox]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[maven-bundle-plugin]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring dm]]></category>

		<guid isPermaLink="false">http://blog.justoaguilar.com/?p=350</guid>
		<description><![CDATA[Actualmente estoy trabajando en un proyecto en el que OSGi va a jugar un papel determinante. En próximos posts hablaré sobre OSGi, y sobre que papel juega dentro de las aplicaciones Java. Cuando se habla de OSGi, se habla de programación modular donde un módulo es un fichero JAR (Java ARchive). En OSGi un módulo [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<!--INFOLINKS_ON-->
<p><p>Actualmente estoy trabajando en un proyecto en el que <a href="http://www.osgi.org"><em>OSGi</em></a> va a jugar un papel determinante. En próximos <em>posts</em> hablaré sobre <em>OSGi</em>, y sobre que papel juega dentro de las aplicaciones <em>Java</em>. </p>
<p>Cuando se habla de <em>OSGi</em>, se habla de programación modular donde un módulo es un fichero <em>JAR</em> (<em>Java ARchive</em>). En <em>OSGi</em> un módulo tiene el nombre de <em>bundle</em>.</p>
<p>Para poder entender este <em>post</em> se requieren conocimientos de :</p>
<ul>
<li>Maven 2</li>
<li>Spring Framework</li>
<li>Eclipse, Equinox</li>
<li>OSGi</li>
<li>Spring Dynamic Modules  (Spring DM)</li>
</ul>
<p>La prueba de concepto que vamos a describir a continuación, paso a paso, es la siguiente:</p>
<ul>
<li><strong>Crear</strong> un <em><strong>bundle</strong></em> e instalarlo en Equinox. </li>
<li><strong>Asociar</strong> al <em>bundle</em> una clase <em><strong>BundleActivator</strong></em> para comprobar que el <em>bundle</em> ha sido inicializado correctamente.</li>
<li><strong>Instalar</strong> el <em>bundle</em> <strong><strong>Extender</strong></strong> de <em><strong>Spring DM</strong></em> y sus dependencias dentro de <em>Equinox</em>.</li>
<li><strong>Configurar</strong> el <em>bundle</em> para que arranque un <em><strong>ApplicationContext</strong></em> de <em>Spring</em>.</li>
</ul>
<p>La idea de este <em>post</em> es mostrar de manera rápida el proceso de configuración, por ello no voy a explicar detalladamente el conjunto de herramientas y <em>plugins</em> utilizados a lo largo del proceso. Esto quedará pendiente para próximos <em>posts</em>.</p>
<div id="titulo">1. Creación de un <em>bundle OSGi</em></div>
<p><strong>Creamos</strong> un nuevo <strong>proyecto Java</strong> dentro de nuestro espacio de trabajo de <em>Eclipse</em>. En mi caso, <em>es.jmac.springdm</em> </p>
<p><strong>Mavenizamos</strong> ese proyecto, yo he usado el <em>plugin</em> de <em>Sonatype</em> <strong><a target="_blank" href="http://www.sonatype.com/products/m2eclipse">M2Eclipse</a></strong>, pero vamos puede hacerse a mano, basta crear un fichero <em>pom.xml</em>.</p>
<p>La información del fichero Maven de configuración del proyecto será la siguiente : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;

  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;es.jmac&lt;/groupId&gt;
  &lt;artifactId&gt;springdm&lt;/artifactId&gt;
  &lt;packaging&gt;jar&lt;/packaging&gt;
  &lt;name&gt;springdm&lt;/name&gt;
  &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
  &lt;description&gt;Prueba de concepto de Spring Dynamic Modules sobre Equinox&lt;/description&gt;

&lt;/project&gt;
</pre>
<p><em>Creamos</em> una nueva <em>source folder</em>, <strong>src/main/java</strong>.</p>
<p>Al final del proceso, nuestro proyecto en Eclipse debería tener una estructura similar a la siguiente:</p>
<div id="attachment_376" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.justoaguilar.com/wp-content/uploads/2009/07/estructura_inicial_proyecto.jpg"><img src="http://blog.justoaguilar.com/wp-content/uploads/2009/07/estructura_inicial_proyecto-300x176.jpg" alt="Estructura inicial del proyecto" title="Estructura inicial del proyecto" width="300" height="176" class="size-medium wp-image-376" /></a><p class="wp-caption-text">Estructura inicial del proyecto</p></div>
<p>Una vez que tenemos nuestro proyecto <em>Java</em> <em>mavenizado</em> vamos a incorporarle la información necesaria que lo identifique como un <em>bundle OSGi</em>.</p>
<p>Al inicio del <em>post</em> se ha comentado que un <em>bundle OSGi</em> es un fichero <em>JAR</em>. Sin embargo no basta con eso. Ese fichero <em>JAR</em> debe contener un información concreta que permita a la plataforma <em>OSGi</em> identificar ese fichero como un <em>bundle OSGi</em>. Esta información viene especificada en el fichero <em>MANIFEST.MF</em>. Esa será nuestra siguiente tarea generar ese fichero con la información necesaria para ser identificado como un <em>bundle OSGi</em>.</p>
<p></p>
<div id="nota">
Bundle OSGi = JAR + MANIFEST.MF con CABECERAS OSGi
</div>
<p></p>
<p>Bueno, ahora hay que generar el <em>MANIFEST.MF</em>. Hay varias formas de hacerlo, se puede hacer mano, si se conocen el conjunto de cabeceras <em>OSGi</em> o bien a través de alguna herramienta. En mi caso he utilizado un plugin para <em>Maven</em> que permite realizar varias operaciones sobre <em>bundles OSGI</em>, <a target="_blank" href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html">maven-bundle-plugin</a>. Como he comentado anteriormente, no voy a explicar como funciona el plugin, os indico que hay que poner en el <em>pom.xml</em> y la orden que hay que lanzar.</p>
<p>Actualizar el pom.xml con el siguiente código : </p>
<pre class="brush: xml; title: ; notranslate">
...
&lt;packaging&gt;bundle&lt;/packaging&gt;
...
&lt;build&gt;
  &lt;plugins&gt;
    &lt;plugin&gt;
      &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;
      &lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;
      &lt;version&gt;2.0.0&lt;/version&gt;
      &lt;extensions&gt;true&lt;/extensions&gt;
      &lt;configuration&gt;
        &lt;instructions&gt;
	  &lt;Bundle-SymbolicName&gt;${groupId}.${artifactId}&lt;/Bundle-SymbolicName&gt;
	  &lt;Bundle-Version&gt;${pom.version}&lt;/Bundle-Version&gt;
	&lt;/instructions&gt;
      &lt;/configuration&gt;
    &lt;/plugin&gt;
  &lt;/plugins&gt;
&lt;/build&gt;
...
</pre>
<p><strong>ATENCIÓN</strong> : No olvidéis cambiar el valor de elemento <em><em>packaging</em></em> a <em><em>bundle</em></em>.</p>
<p>Ejecutad por consola o a través de <em>Eclipse</em>, el siguiente comando <em>Maven</em> :</p>
<pre class="brush: bash; title: ; notranslate">

mvn clean package -Declipse.pde
</pre>
<p>Esta orden generará un fichero <em>JAR</em> con nuestro proyecto, que por ahora no tiene nada, y que contendrá un fichero <em>MANIFEST.MF</em> con las cabeceras necesarias para ser reconocido como un <em>bundle OSGi</em>. Lo que tenéis que hacer es iros a la carpeta target donde se ha copiado el fichero <em>JAR</em> y sacar de él fichero <em>MANIFEST.MF</em> para copiarlo a vuestro proyecto en <em>Eclipse</em>, ojo, dentro de la carpeta <em>META-INF</em>. Ya sé que no es muy sutil, pero es rápido.</p>
<div style="padding:5px;border:1px solid #ccc;background-color:#fafafa">
<strong>ACTUALIZACIÓN</strong><br />
Una forma más automática de generar el fichero <em>MANIFEST.MF</em> sería utilizando el <em>goal <strong>manifest</strong></em> del anterior <em>plugin</em>. Tendríamos que cambiar nuestra definición anterior del <em>plugin</em> por la siguiente:</p>
<pre class="brush: xml; title: ; notranslate">
...
&lt;plugin&gt;
  &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;
  &lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;
  &lt;version&gt;2.0.0&lt;/version&gt;
  &lt;extensions&gt;true&lt;/extensions&gt;
  &lt;configuration&gt;
    &lt;manifestLocation&gt;META-INF&lt;/manifestLocation&gt;
    &lt;instructions&gt;
      &lt;Bundle-SymbolicName&gt;${groupId}.${artifactId}&lt;/Bundle-SymbolicName&gt;
      &lt;Bundle-Version&gt;${pom.version}&lt;/Bundle-Version&gt;
    &lt;/instructions&gt;
  &lt;/configuration&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;id&gt;genera-manifest&lt;/id&gt;
      &lt;phase&gt;generate-resources&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;manifest&lt;/goal&gt;
      &lt;/goals&gt;
    &lt;/execution&gt;
    &lt;execution&gt;
      &lt;id&gt;genera-bundle&lt;/id&gt;
      &lt;phase&gt;package&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;bundle&lt;/goal&gt;
      &lt;/goals&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
&lt;/plugin&gt;
...
</pre>
<p>El plugin anterior tiene dos ejecuciones en dos fases distintas del ciclo de vida de <em>Maven</em>. En la primera fase, <em><strong>generate-resources</strong></em>, se ejecuta el <em>goal</em> <em><strong>manifest</strong></em>. En la segunda fase, <strong><em>package</em></strong>, se ejecuta el <em>goal</em> definido por defecto en el <em>plugin</em>, <em><strong>bundle</strong></em>.</p>
<p>No olvidar añadir el elemento : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;manifestLocation /&gt;
</pre>
</div>
<p>Vuestro fichero <em>MANIFEST.MF</em> debería contener algo parecido a esto:</p>
<pre class="brush: xml; title: ; notranslate">
Manifest-Version: 1.0
Built-By: justo
Created-By: Apache Maven Bundle Plugin
Import-Package: es.jmac.springdm,org.osgi.framework;version=&quot;1.3&quot;
Export-Package: es.jmac.springdm;uses:=&quot;org.osgi.framework&quot;
Bundle-Version: 1.0.0.SNAPSHOT
Bundle-Name: springdm
Bundle-Description: Prueba de concepto de Spring Dynamic Modules sobre
 Equinox
Build-Jdk: 1.5.0_19
Private-Package: es.jmac.springdm,
Bundle-ManifestVersion: 2
Bundle-SymbolicName: es.jmac.springdm
Tool: Bnd-0.0.311
</pre>
<div id="titulo">2. Ejecución del <em>bundle</em> dentro de <em>Equinox</em></div>
<p>Ya hemos creado un <em>bundle OSGi</em>, ahora vamos a ver si lo hemos creado correctamente. Para ello, vamos a lanzar una instancia de <em>Equinox</em> y especificaremos que dentro de esa instancia se cargue nuestro bundle recien creado.</p>
<p>Nos vamos al menún <strong>Run</strong> &#8211;> <strong>Run Configurations&#8230;</strong> de <em>Eclipse</em></p>
<div id="attachment_374" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.justoaguilar.com/wp-content/uploads/2009/07/run_configurations.jpg"><img src="http://blog.justoaguilar.com/wp-content/uploads/2009/07/run_configurations-300x165.jpg" alt="Run Configurations..." title="Run Configurations..." width="300" height="165" class="size-medium wp-image-374" /></a><p class="wp-caption-text">Run Configurations...</p></div>
<p>Selecciónamos <em><strong>OSGi Framework</strong></em> y pulsando el botón derecho seleccionamos <strong><strong>New&#8230;</strong></strong></p>
<div id="attachment_372" class="wp-caption aligncenter" style="width: 287px"><a href="http://blog.justoaguilar.com/wp-content/uploads/2009/07/new_osgi_framework.jpg"><img src="http://blog.justoaguilar.com/wp-content/uploads/2009/07/new_osgi_framework-277x300.jpg" alt="New OSGi Framework" title="New OSGi Framework" width="277" height="300" class="size-medium wp-image-372" /></a><p class="wp-caption-text">New OSGi Framework</p></div>
<p>En la parte derecha de la ventana aparecerán la lista de bundles que tenemos actualmente, dividos en dos grupos, los <em>bundles</em> creados en nuestro workspace y los bundles instalados en la <em>Target Platform</em>, que suele ser <em>$ECLIPSE_HOME/plugins</em>. </p>
<div id="attachment_378" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.justoaguilar.com/wp-content/uploads/2009/07/bundles.jpg"><img src="http://blog.justoaguilar.com/wp-content/uploads/2009/07/bundles-300x217.jpg" alt="Lista de Bundles" title="Lista de Bundles" width="300" height="217" class="size-medium wp-image-378" /></a><p class="wp-caption-text">Lista de Bundles</p></div>
<p>Los siguientes pasos serán seleccionar nuestro <em>bundle</em>, deseleccionar todos los bundles de la sección <em>Target Platform</em> y pichar sobre el botón <strong>Add Required Bundles</strong>, es nos marcará un único bundle el <strong>core</strong> de <em>OSGi</em>, <strong>org.eclipse.osgi</strong>. Pinchamos en <strong><em>Apply</em></strong> para salvar los cambios y pichamos en <strong><em>Run</em></strong>.</p>
<p>A continuación se debe abrir la ventana de <em>Console</em> en la que aparecerá el <em>shell</em> de <em>OSGi</em>, algo como :<br />
<code>osgi></code><br />
Para comprobar si nuestro bundle ha sido inicializado correctamente, introducimos el comando <em>ss</em> y pulsamos intro. Debería aparecer lo siguiente, si no, algo hemos mal : </p>
<div id="attachment_375" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.justoaguilar.com/wp-content/uploads/2009/07/ss_osgi.jpg"><img src="http://blog.justoaguilar.com/wp-content/uploads/2009/07/ss_osgi-300x193.jpg" alt="Short Status (ss)" title="Short Status (ss)" width="300" height="193" class="size-medium wp-image-375" /></a><p class="wp-caption-text">Short Status (ss)</p></div>
<p>Acabamos de ejecutar nuestro <em>bundle</em> dentro de <em>Equinox</em>. Tampoco tiene mucho mérito porque es un <em>bundle</em> vacío, pero bueno, vamos poco a poco. </p>
<div id="titulo">3. Añadimos una clase <em>BundleActivator</em> a nuestro <em>bundle</em></div>
<p>Una clase <em>activator</em> se encarga de inicializar/liberar un <em>bundle</em>. Esta pequeña clase nos avisará que el bundle ha sido inicializado/parado correctamente. </p>
<p>La clase debe implementar la interfaz <em>BundleActivator</em> definida en la <em><a href="http://www.osgi.org/javadoc/r4v41/org/osgi/framework/BundleActivator.html">API</a</em> de <em>OSGi</em>. Para que nuestro código compile correctamente será necesario añadir un par de dependencias a nuestro <em>pom.xml</em>. Basta con añadir el siguiente fragmento de código:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;dependencies&gt;
  ...
  &lt;dependency&gt;
    &lt;groupId&gt;org.osgi&lt;/groupId&gt;
    &lt;artifactId&gt;osgi_R4_core&lt;/artifactId&gt;
    &lt;version&gt;1.0&lt;/version&gt;
    &lt;scope&gt;provided&lt;/scope&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.osgi&lt;/groupId&gt;
    &lt;artifactId&gt;osgi_R4_compendium&lt;/artifactId&gt;
    &lt;version&gt;1.0&lt;/version&gt;
    &lt;scope&gt;provided&lt;/scope&gt;
  &lt;/dependency&gt;
...
&lt;/dependencies&gt;
</pre>
<p>El código de la clase <em>SpringDMActivator</em> es el siguiente:</p>
<pre class="brush: java; title: ; notranslate">
package es.jmac.springdm;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

/**
 * @author Justo Aguilar
 * Creation date : 20/07/2009
 *
 * &lt;p&gt;
 */
public class SpringDMActivator implements BundleActivator {

	public void start(BundleContext context) throws Exception {
		System.out.println(&quot;Arrancando bundle &quot; + context.getBundle().getSymbolicName() + &quot;...&quot;);
	}

	public void stop(BundleContext context) throws Exception {
		System.out.println(&quot;Parando bundle &quot; + context.getBundle().getSymbolicName() + &quot;...&quot;);
	}
}
</pre>
<p>Un último paso necesario  es añadir al fichero <em>MANIFEST.MF</em> la siguiente línea:</p>
<pre class="brush: xml; title: ; notranslate">
Bundle-Activator: es.jmac.springdm.SpringDMActivator
</pre>
<p>con la ruta de nuestro clase <em>BundleActivator</em>.</p>
<p>La próxima vez que arranquemos la instancia del <em>OSGi Framework</em> creada anteriormente debería aparecer el mensaje definido por el método <em>start</em> de la clase <em>SpringDMActivator</em>.</p>
<div id="titulo">4. Spring DM entra en juego</div>
<p>En este post se hace un uso trivial e insignificante de <em>Spring DM</em>. En próximos post se mostrará la verdadera potencia de integrar <em>Spring Framework</em> con <em>OSGi</em>. </p>
<p>Nuestro objetivo en este último paso es inicializar un <em>ApplicationContext</em> de <em>Spring</em> al iniciar un bundle en <em>OSGi</em>.</p>
<p>Lo primero que haremos será crear un <em>POJO</em> para referenciarlo posteriormente en el fichero <em>applicationContext.xml</em> de <em>Spring</em>. Yo he creado una clase <em>Entity</em> : </p>
<pre class="brush: java; title: ; notranslate">
package es.jmac.springdm.domain;

import java.io.Serializable;

/**
 * @author Justo Aguilar
 * Creation date : 20/07/2009
 *
 */
public class Entity implements Serializable {

	/** Identificador de Serialización  */
	private static final long serialVersionUID = 147003001012587224L;

	/** Identificador de la entidad */
	private Long id;

	/** Nombre de la entidad */
	private String name;

	/**
	 * Constructor de Entity. Necesita el identificador.
	 * @param id Identificador de la entidad.
	 */
	public Entity(Long id) {
		this.id = id;
		System.out.println(&quot;Creando entidad con id : &quot; + id);
	}

}
</pre>
<p>A continuación hay que crear y definir el fichero <em>applicationContext.xml</em> de <em>Spring</em>. Este fichero se situará dentro de una carpeta <em>spring</em> que a su vez debe estar contenida en la carpeta <em>META-INF</em> del proyecto.</p>
<pre>
Proyecto
|__META-INF
    |__spring
        |__applicationContext.xml
</pre>
<p>Este fichero contendrá la siguiente información :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
   xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans   

http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;entity&quot; class=&quot;es.jmac.springdm.domain.Entity&quot;&gt;
      &lt;constructor-arg&gt;&lt;value&gt;1&lt;/value&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;
&lt;/beans&gt;
</pre>
<p>Ahora es cuando entra en juego <em>Spring DM</em>. Evidentemente, por si solo, <em>Equinox</em> no tiene ni idea para que sirve la carpeta spring creada bajo <em>META-INF</em> ni los ficheros contiene ésta, por tanto si volvemos a arrancar <em>Equinox</em> veremos que no sucede nada nuevo. Para dar un tratamiento especial a este tipo de <em>bundles</em>, <em>Spring-Powered bundle</em> según la documentación de <em>Spring DM</em>, es necesario que alguién esté pendiente de cuando se inicializa o se para este tipo de <em>bundles</em>. Ese alguien es conocido como <strong>Extender</strong>. <em>Extender</em> no es más que un <em>bundle</em> que está a la escucha del ciclo de vida del restos de <em>bundles</em>, cuando un <em>bundle</em> se inicializa o se para, comprueba si se trata de un <em>Spring-Powered bundle</em> para realizar la tarea de inicialiar/parar el <em>ApplicationContext</em> asociado al éste.</p>
<p>Por tanto será necesario instalar el <em>bundle Extender</em> y todos sus dependencias dentro de la <em>Target Platform</em> y marcarlos para que se ejecuten dentro de <em>Equinox</em>. Bueno, vamos por pasos.</p>
<p><strong>Primero</strong>, nos descargamos todos los <em>bundles</em> que necesitamos. Para ello acudimos al repositorio de <em>springsource</em>, http://www.springsource.com/repository/app/ y nos descargamos el <em>jar</em> <a href="http://www.springsource.com/repository/app/bundle/version/detail?name=org.springframework.osgi.extender&#038;version=1.2.0&#038;searchType=bundlesByName&#038;searchQuery=extender">org.springframework.osgi.extender</a>, en mi caso la versión 1.2.0. En la parte inferior de esa ventana aparece una sección plegada que dice <em>Required Dependencies (9)</em>, la desplegamos y nos bajamos cada uno de los <em>bundles</em> que ahí se indican.</p>
<div id="attachment_377" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.justoaguilar.com/wp-content/uploads/2009/07/dependencias_extender.jpg"><img src="http://blog.justoaguilar.com/wp-content/uploads/2009/07/dependencias_extender-300x272.jpg" alt="Dependencias Bundle Extender de Spring DM" title="Dependencias Bundle Extender de Spring DM" width="300" height="272" class="size-medium wp-image-377" /></a><p class="wp-caption-text">Dependencias Bundle Extender de Spring DM</p></div>
<p><strong>Segundo</strong>, copiamos los <em>JARs</em> descargados al directorio de nuestra <em>Target Platform</em>, si no sabes a lo que me refiero, no lo habrás cambiado asi que el directorio es  $INSTALACION_ECLIPSE/plugins. Reiniciamos <em>Eclipse</em>.</p>
<p><strong>Tercero</strong>, abrimos la ventana <em>Run Configurations&#8230;</em> y comprobamos que entre los <em>bundles</em> de la sección <em>Target Platform</em> se encuentran los que acabamos de copiar. <strong>Marcamos</strong> el bundle de <strong>Extender</strong> y volvemos a pinchar en <strong>Add Required Bundles</strong>, veremos como se seleccionan el resto de bundles copiados en el paso anterior. <strong>Aplicamos</strong> y <strong>ejecutamos</strong>.</p>
<p>Si no os aparece el mensaje definido en el constructor del <em>POJO</em>, algo habréis hecho mal.  </p>
<p></p>
<div id="referencias">
<b>Enlaces relacionados:</b> </p>
<ul>
<li><a href="http://blog.justoaguilar.com/2009/08/que-es-osgi-y-para-que-sirve/">¿Qué es OSGi &#8230; y para qué sirve?</a></li>
<li><a href="http://www.osgi.org/Main/HomePage">OSGi Foundation</a></li>
<li><a href="http://www.springsource.org/osgi">Spring Dynamic Modules</a></li>
<li><a href="http://www.eclipse.org/equinox/">Equinox</a></li>
<li><a href="http://maven.apache.org">Apache Maven</a></li>
<li><a href="http://www.springsource.org/about">Spring Framework</a></li>
<li><a href="http://www.eclipse.org/">Eclipse</a></li>
<li><a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html">maven-bundle-plugin</a></li>
<li><a href="http://felix.apache.org/site/index.html">Apache Felix</a></li>
<li><a href="http://www.aqute.biz/Code/Bnd">BND</a></li>
<li><a href="http://wiki.ops4j.org/display/ops4j/Pax">Pax</a></li>
</ul>
</div>

<!--INFOLINKS_OFF-->
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://blog.justoaguilar.com/2009/07/configuracion-osgi-spring-dm-y-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javadoc con Diagramas de Clases usando Graphviz + UMLGraph + Maven</title>
		<link>http://blog.justoaguilar.com/2008/07/javadoc-con-diagramas-de-clases-usando-graphviz-umlgraph-maven/</link>
		<comments>http://blog.justoaguilar.com/2008/07/javadoc-con-diagramas-de-clases-usando-graphviz-umlgraph-maven/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 19:24:23 +0000</pubDate>
		<dc:creator>justo</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[graphviz]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javadoc]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[umlgraph]]></category>

		<guid isPermaLink="false">http://blog.justoaguilar.com/?p=59</guid>
		<description><![CDATA[Una de las herramientas más importantes con las que cuenta la plataforma Java es, sin duda, el javadoc. A través de ella es posible crear una referencia completa y homogénea de todo el conjunto de clases definidas es nuestro proyecto. Toda página de una clase del javadoc está dividida en distintas zonas, la primera de [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<!--INFOLINKS_ON-->
<p><p>Una de las herramientas más importantes con las que cuenta la plataforma <i>Java</i> es, sin duda, el <a href="http://java.sun.com/j2se/javadoc/">javadoc</a>. A través de ella es posible crear una referencia completa y homogénea de todo el conjunto de clases definidas es nuestro proyecto. </p>
<p>Toda página de una clase del <i>javadoc</i> está dividida en distintas zonas, la primera de ellas muestra la situación jerárquica de la clase respecto a la clase padre <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html">Object</a>. Bajo la situación jerárquica aparece la lista de interfaces que implementa si existe alguna y, por último, la lista de clases que la extienden. Para las interfaces aparece la lista de superinterfaz en primer lugar y la lista de subinterfaces en segundo.</p>
<p>Aunque esta información pueda ser suficiente en muchos casos, no estaría de más completarla con diagramas de clases que permitan una rápida visualización de la jerarquía de clases de nuestro proyecto. Ese es el objetivo de este post, añadir <em>diagramas de clases UML</em> a nuestro <em>javadoc</em>.</p>
<p><a class="thickbox" rel="" href='http://blog.justoaguilar.com/wp-content/gallery/umlgraph/nivel01.png' title=''><img src='http://blog.justoaguilar.com/wp-content/gallery/umlgraph/thumbs/thumbs_nivel01.png' alt='Diagrama UML generado con UMLGraph' class='ngg-singlepic ngg-center' /></a></p>
<p>Para ello necesitaremos dos cosas básicamente :</p>
<ul>
<li><a href="http://www.graphviz.org">Graphviz</a>, librería que permite la generación de gráficos.</li>
<li><a href="http://wiki.wsmoak.net/cgi-bin/wiki.pl?UMLGraph">UMLGraph</a> plugin para maven que sobreescribe el <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/javadoc/overview.html">doclet</a> que genera el javadoc para insertar los gráficos generados por Graphviz.</li>
<li><a href="http://maven.apache.org">Maven</a></li>
</ul>
<p>A continuación vamos a ver como instalar <em>Graphviz</em> y como configurar el <a href="http://maven.apache.org/pom.html">pom.xml</a> del proyecto maven para que use el plugin <em>UMLGraph</em>.</p>
<h3>Instalación de Graphviz</h3>
<p>Hay varias formas de hacerlo, bajando el fuente y compilando, haciendo un <em>checkout</em> del repositorio <a href="http://www.nongnu.org/cvs/">CVS</a> o dejando que el sistema de paquetes de tu sistema operativo lo haga todo por tí <img src='http://blog.justoaguilar.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Esto último es lo que haremos pues la finalidad de éste post es otra.</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get update
sudo apt-get install graphviz
man dot
</pre>
<p></p>
<p>La última entrada es sólo para comprobar que el paquete ha sido instalado correctamente. </p>
<h3>Modificación del fichero <em>pom.xml</em> del proyecto</h3>
<p>Simplemente se debe añadir al fichero las siguientes líneas de código</p>
<pre class="brush: xml; title: ; notranslate">
...
&lt;reporting&gt;
  &lt;plugins&gt;
    &lt;plugin&gt;
      &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
      &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;
      &lt;configuration&gt;
        &lt;doclet&gt;gr.spinellis.umlgraph.doclet.UmlGraphDoc&lt;/doclet&gt;
        &lt;docletArtifact&gt;
          &lt;groupId&gt;gr.spinellis&lt;/groupId&gt;
          &lt;artifactId&gt;UmlGraph&lt;/artifactId&gt;
          &lt;version&gt;4.6&lt;/version&gt;
        &lt;/docletArtifact&gt;
        &lt;additionalparam&gt;
          -inferrel -inferdep -quiet -hide java.* -collpackages java.util.* -qualify
          -postfixpackage -nodefontsize 9
          -nodefontpackagesize 7
        &lt;/additionalparam&gt;
      &lt;/configuration&gt;
    &lt;/plugin&gt;
  &lt;/plugins&gt;
&lt;/reporting&gt;
...
</pre>
<p>Para generar el <em>javadoc</em> se ejecutará el comando <code>mvn javadoc:javadoc</code> dentro del directorio<br />
donde se encuentra el fichero <code>pom.xml</code>.</p>
<p><a class="thickbox" rel="" href='http://blog.justoaguilar.com/wp-content/gallery/umlgraph/umlgraph_javadoc.png' title=''><img src='http://blog.justoaguilar.com/wp-content/gallery/umlgraph/thumbs/thumbs_umlgraph_javadoc.png' alt='Javadoc de la clase Nivel 1' class='ngg-singlepic ngg-center' /></a></p>

<!--INFOLINKS_OFF-->
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://blog.justoaguilar.com/2008/07/javadoc-con-diagramas-de-clases-usando-graphviz-umlgraph-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurar proxy en Subversion y Maven</title>
		<link>http://blog.justoaguilar.com/2008/07/configurar-proxy-en-subversion-y-maven/</link>
		<comments>http://blog.justoaguilar.com/2008/07/configurar-proxy-en-subversion-y-maven/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 19:34:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://blog.justoaguilar.com/?p=23</guid>
		<description><![CDATA[Hoy he empezado a trabajar en las oficinas del cliente del proyecto que me ocupará los próximos meses y he tenido que configurar todo mi sistema para que se conecte a Internet a través de un proxy. Aunque esta configuración es trivial, voy a comentar los ficheros que hay modificar para que tanto Maven como [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<!--INFOLINKS_ON-->
<p><p>Hoy he empezado a trabajar en las oficinas del cliente del proyecto que me ocupará los próximos meses y he tenido que configurar todo mi sistema para que se conecte a Internet a través de un proxy. Aunque esta configuración es trivial, voy a comentar los ficheros que hay modificar para que tanto <a href="http://maven.apache.org"><em>Maven</em></a> como <a href="http://subversion.tigris.org"><em>Subversion</em></a> pueden acceder a repositorios externos a través de un proxy.</p>
<p></p>
<p><strong>Maven</strong></p>
<p>En <em>Maven</em> el fichero que tiene que ser modificado se llama <code>settings.xml</code> y está situado bajo el directorio <code>$MAVEN_HOME/config</code>, siendo <code>$MAVEN_HOME</code> el directorio base de instalación de <em>Maven</em>.</p>
<p>Dentro de este fichero será necesario buscar el siguiente bloque de código :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;proxies&gt;
&lt;proxy&gt;
&lt;id&gt;optional&lt;/id&gt;
&lt;active&gt;true&lt;/active&gt;
&lt;protocol&gt;http&lt;/protocol&gt;
&lt;username&gt;proxyuser&lt;/username&gt;
&lt;password&gt;proxypass&lt;/password&gt;
&lt;host&gt;proxy.host.net&lt;/host&gt;
&lt;port&gt;80&lt;/port&gt;
&lt;nonProxyHosts&gt;local.net,some.host.com&lt;/nonProxyHosts&gt;
&lt;/proxy&gt;
&lt;/proxies&gt;
</pre>
<p>Simplemente debéis establecer los parámetros de la configuración de acceso al proxy en los elementos correspondientes, por ejemplo : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;proxy&gt;
&lt;!-- Parámetro opcional --&gt;
&lt;id&gt;Proxy oficina cliente&lt;/id&gt;
&lt;active&gt;true&lt;/active&gt;
&lt;protocol&gt;http&lt;/protocol&gt;
&lt;username&gt;proxyUser&lt;/username&gt;
&lt;password&gt;proxyPassword&lt;/password&gt;
&lt;host&gt;10.23.22.43&lt;/host&gt;
&lt;port&gt;80&lt;/port&gt;
&lt;!-- Direcciones a excluir de pasar por el proxy --&gt;
&lt;nonProxyHosts&gt;localhost, 10.23.23.44&lt;/nonProxyHosts&gt;
&lt;/proxy&gt;
&lt;/proxies&gt;
</pre>
<p>
<strong>Subversion</strong><br />
<br />
La configuración de <em>Subversion</em> es muy parecida, aunque permite mayor flexibilidad. En este caso el fichero a modificar se encuentra en la ruta <code>/etc/subversion/servers</code>. La flexibilidad que aporta <em>Subversion</em> a la hora de configurar el acceso a un repositorio via proxy está reflejada en la posibilidad de configurar un <em>proxy global</em> para todos los repositorios o la posibilidad de establecer la configuración de un proxy para grupo de repositorios. </p>
<p>El ficheros de configuración base es el siguiente : </p>
<pre class="brush: bash; title: ; notranslate">
### This file specifies server-specific protocol parameters,
### including HTTP proxy information, and HTTP timeout settings.
###
### The currently defined server options are:
###   http-proxy-host            Proxy host for HTTP connection
###   http-proxy-port            Port number of proxy host service
###   http-proxy-username        Username for auth to proxy service
###   http-proxy-password        Password for auth to proxy service
###   http-proxy-exceptions      List of sites that do not use proxy
###   http-timeout               Timeout for HTTP requests in seconds
###   http-compression           Whether to compress HTTP requests
###   neon-debug-mask            Debug mask for Neon HTTP library
###   ssl-authority-files        List of files, each of a trusted CAs
###   ssl-trust-default-ca       Trust the system 'default' CAs
###   ssl-client-cert-file       PKCS#12 format client certificate file
###   ssl-client-cert-password   Client Key password, if needed.
###
### HTTP timeouts, if given, are specified in seconds.  A timeout
### of 0, i.e. zero, causes a builtin default to be used.
###
### The commented-out examples below are intended only to
### demonstrate how to use this file; any resemblance to actual
### servers, living or dead, is entirely coincidental.

### In this section, the URL of the repository you're trying to
### access is matched against the patterns on the right.  If a
### match is found, the server info is from the section with the
### corresponding name.

[groups]
# group1 = *.collab.net
# othergroup = repository.blarggitywhoomph.com
# thirdgroup = *.example.com

### Information for the first group:
# [group1]
# http-proxy-host = proxy1.some-domain-name.com
# http-proxy-port = 80
# http-proxy-username = blah
# http-proxy-password = doubleblah
# http-timeout = 60
# neon-debug-mask = 130

### Information for the second group:
# [othergroup]
# http-proxy-host = proxy2.some-domain-name.com
# http-proxy-port = 9000
# No username and password, so use the defaults below.

### You can set default parameters in the 'global' section.
### These parameters apply if no corresponding parameter is set in
### a specifically matched group as shown above.  Thus, if you go
### through the same proxy server to reach every site on the
### Internet, you probably just want to put that server's
### information in the 'global' section and not bother with
### 'groups' or any other sections.
###
### If you go through a proxy for all but a few sites, you can
### list those exceptions under 'http-proxy-exceptions'.  This only
### overrides defaults, not explicitly matched server names.
###
### 'ssl-authority-files' is a semicolon-delimited list of files,
[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
# http-proxy-host = defaultproxy.whatever.com
# http-proxy-port = 7000
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword
# http-compression = no
# No http-timeout, so just use the builtin default.
# No neon-debug-mask, so neon debugging is disabled.
# ssl-authority-files = /path/to/CAcert.pem;/path/to/CAcert2.pem
</pre>
<p>Como puedes observar, en la primera parte del fichero se definen los grupos, <em>groups</em>, con la <em>url</em> de los repositorios asociados. </p>
<pre class="brush: bash; title: ; notranslate">
[groups]
group1 = *.collab.net
othergroup = repository.blarggitywhoomph.com
thirdgroup = *.example.com
</pre>
<p>Observad que se permite el mapeo de todos los subdominios de un dominio mediante el uso de *.</p>
<p>En la segunda parte del fichero, se especifica la configuración del proxy asociada a cada grupo. En primer lugar se especifica, [entre corchetes] el nombre del grupo de repositorios a configurar y posteriormente los parámetros propios de configuración del proxy, cuyos nombres son autoexplicativos.</p>
<pre class="brush: bash; title: ; notranslate">
[group1]
http-proxy-host = proxy1.some-domain-name.com
http-proxy-port = 80
http-proxy-username = blah
http-proxy-password = doubleblah
http-timeout = 60
</pre>
<p>Por último, es posible definir una configuración global de acceso a todos los repositorios, se realiza bajo la etiqueta <b>[global]</b></p>
<pre class="brush: bash; title: ; notranslate">
[global]
http-proxy-exceptions = localhost, 10.23.23.44
http-proxy-host = 10.23.22.43
http-proxy-port = 80
http-proxy-username = proxyUser
http-proxy-password = proxyPassword
</pre>
<p>Para una configuración más avanzada consultar la <a href="http://svnbook.red-bean.com/en/1.1/ch07.html">referencia oficial</a>.</p>

<!--INFOLINKS_OFF-->
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://blog.justoaguilar.com/2008/07/configurar-proxy-en-subversion-y-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

