<?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; spring</title>
	<atom:link href="http://blog.justoaguilar.com/tag/spring/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>Configurar Axis 2 + Spring 2 + Weblogic 9.2</title>
		<link>http://blog.justoaguilar.com/2008/07/configurar-axis-2-spring-2-weblogic-92/</link>
		<comments>http://blog.justoaguilar.com/2008/07/configurar-axis-2-spring-2-weblogic-92/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 16:54:04 +0000</pubDate>
		<dc:creator>justo</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[weblogic]]></category>

		<guid isPermaLink="false">http://blog.justoaguilar.com/?p=45</guid>
		<description><![CDATA[Aunque existen en la red muchos posts acerca de este tipo de configuración, no hay ninguno, que yo haya leído, que explique todo el proceso de forma sencilla. Este es el propósito de este post, describir de una manera cercana la configuración de Axis 2 para que use el contexto de Spring todo ello sobre [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<!--INFOLINKS_ON-->
<p><p>Aunque existen en la red muchos <em>posts</em> acerca de este tipo de configuración, no hay ninguno, que yo haya leído, que explique todo el proceso de forma sencilla. Este es el propósito de este post, describir de una manera cercana la configuración de <em>Axis 2</em> para que use el contexto de <em>Spring</em> todo ello sobre el servidor <em>Weblogic 9.2</em>.</p>
<p>Antes de empezar a describir todos los detalles de la configuración vamos a intentar explicar el porqué de ésta, particularmente la interacción entre <em>Axis</em> y <em>Spring</em>.</p>
<p><strong>Sin <em>Spring</em></strong></p>
<p>Supongamos que en nuestra aplicación no usamos <em>Spring</em>, el fichero <em>service.xml </em>de un servicio de <em>Axis</em> sería como sigue:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;service name=&quot;ServicioWebSinSpring&quot;&gt;
  &lt;parameter name=&quot;ServiceClass&quot;&gt;
    com.jmaguilar.springaxisweblogic.ws.services.ServicioWebSinSpring
  &lt;/parameter&gt;
  &lt;operation name=&quot;saluda&quot;&gt;
    &lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
  &lt;/operation&gt;
&lt;/service&gt;
</pre>
<p>En el código anterior se indica que el servicio web tiene el nombre de <em>ServicioWebSinSpring</em>, está asociado a la clase <code>com.jmaguilar.springaxisweblogic.ws.services.ServicioWebSinSpring</code> y tiene publicado el método <em>saluda</em>. Simple.</p>
<p><strong>Con <em>Spring</em></strong></p>
<p>Ahora la cosa cambia, <em>Axis</em> no debería poder instanciar la clase del servicio que va a usar, sino que debe solicitarla a <em>Spring</em> para que le proporcione la instancia ya creada y configurada previamente, de forma declarativa, a través del <em>applicationContext-manager.xml</em>.</p>
<p>En primer lugar vamos a ver el fichero de configuración de <em>Spring</em>.</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-2.5.xsd&quot;&gt;

  &lt;bean id=&quot;applicationContext&quot; class=&quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&quot; /&gt;
  &lt;bean id=&quot;servicioWebConSpring&quot; class=&quot; com.jmaguilar.springaxisweblogic.ws.services.ServicioWebConSpring&quot; /&gt;
&lt;/beans&gt;
</pre>
<p>El fichero define dos <em>beans</em>, <em>applicationContext</em> y <em>servicioWebConSpring</em>. El primero de ellos será utilizado por el motor de <em>Axis</em> para recuperar el <em>applicationContext </em>y, a partir de él, extraer cualquier <em>bean </em>ahí definido. Si hemos leido con atención el código nos habrá llamado la atención la clase asociada a este <em>bean</em>, <code>ApplicationContextHolder </code>se  encuentra en el <em>jar axis2-spring-x.y</em>, que viene en el fuente de <em>Axis</em>. El segundo <em>bean</em>, <em>servicioWebConSpring</em>, es nuestro servicio.</p>
<p>Para indicar al motor de <em>Axis</em> que debe recuperar el <em>bean servicioWebConSpring</em> se debe incluir el siguiente código en el fichero <em>service.xml</em> del nuestro servicio web.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;service name=&quot;ServicioWebConSpring&quot;&gt;
  &lt;parameter name=&quot;ServiceObjectSupplier&quot; locked=&quot;false&quot;&gt;org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&lt;/parameter&gt;
  &lt;parameter name=&quot;SpringBeanName&quot; locked=&quot;false&quot;&gt;servicioWebConSpring&lt;/parameter&gt;
  &lt;operation name=&quot;saluda&quot;&gt;
    &lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
  &lt;/operation&gt;
&lt;/service&gt;
</pre>
<p>En este caso, dentro del fichero <em>service.xml</em> se indica mediante el parámetro <em>ServiceObjectSupplier</em> la clase que proporcionará los objetos de servicio, <code>SpringAppContextAwareObjectSupplier</code> que también está dentro del <em>jar</em> <em>axis2-spring-x.y</em>. A través del parámetro <em>SpringBeanName</em> se especifica el <em>bean</em> que actuará como servicio, <em>ojo se debe especifica el nombre del bean, no su clase</em>. Y, por último, se indican las operaciones disponibles.</p>
<p><strong>Weblogic 9.2</strong></p>
<p>Sólo faltan por ultimar los detalles para que el despliegue en <em>Weblogic</em> sea correcto.</p>
<p><em>web.xml</em></p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE web-app PUBLIC &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot; &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot; &gt;
&lt;web-app&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
    &lt;param-value&gt;&lt;!-- indica los ficheros que contienen los beans a inyectar --&gt;
      classpath*:applicationContext-manager.xml
    &lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;listener&gt;&lt;!-- permite la inyeccion de los beans definidos ficheros indicados anteriormente --&gt;
    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
  &lt;/listener&gt;

  &lt;!-- AXIS 2 Configuration --&gt;
  &lt;servlet&gt;
    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.apache.axis2.transport.http.AxisServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
  &lt;/servlet&gt;

  &lt;servlet-mapping&gt;
    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

  ...

&lt;/web-app&gt;
</pre>
<p>Debido a que el servidor de <em>BEA</em> tiene una implementación propia del <em>pull-parser StAX</em> es necesario, para el correcto funcionamiento de <em>Axis</em>, tirar de los <em>jars</em> que vienen incluidos en la distribución de <em>Axis</em>. Para ello es necesario indicar a <em>Weblogic</em> que la preferencia en el <em>classpath</em> es para los <em>jars </em>contenidos en el directorio <em>WEB-INF/lib</em>, ésto se hace a través del fichero <em>weblogic.xml</em> que debe situarse bajo <em>WEB-INF</em>.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;weblogic-web-app xmlns=&quot;http://www.bea.com/ns/weblogic/90&quot;&gt;
  &lt;container-descriptor&gt;
    &lt;prefer-web-inf-classes&gt;true&lt;/prefer-web-inf-classes&gt;
  &lt;/container-descriptor&gt;
&lt;/weblogic-web-app&gt;
</pre>

<!--INFOLINKS_OFF-->
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://blog.justoaguilar.com/2008/07/configurar-axis-2-spring-2-weblogic-92/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

