<?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>Desarrollo en Web &#187; Arquitectura</title>
	<atom:link href="http://blogs.antartec.com/desarrolloweb/category/arquitectura/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.antartec.com/desarrolloweb</link>
	<description>Blog sobre desarrollo de aplicaciones web en Java, Python y JavaScript</description>
	<lastBuildDate>Thu, 06 Jan 2011 19:33:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Maven en detalle &#8211; Parte 3</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/05/maven-en-detalle-parte-3/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/05/maven-en-detalle-parte-3/#comments</comments>
		<pubDate>Mon, 18 May 2009 22:35:18 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=197</guid>
		<description><![CDATA[
			
				
			
		
Continuando con nuestro artículo anterior hoy hablaremos sobre el manejo de las dependencias e IDEs con soporte de Maven.

Problemática
Hasta antes de la aparición de Maven el manejo de las librerías JAR que utilizaba cada proyecto se hacía de manera manual, las librerías normalmente eran almacenadas junto con el código fuente para que no se perdieran.
Muchos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F05%2Fmaven-en-detalle-parte-3%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F05%2Fmaven-en-detalle-parte-3%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Continuando con nuestro <a href="http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/" target="_self">artículo anterior</a> hoy hablaremos sobre el manejo de las dependencias e IDEs con soporte de Maven.</p>
<p><span id="more-197"></span><br />
<strong>Problemática</strong></p>
<p>Hasta antes de la aparición de Maven el manejo de las librerías JAR que utilizaba cada proyecto se hacía de manera manual, las librerías normalmente eran almacenadas junto con el código fuente para que no se perdieran.</p>
<p>Muchos de los proyectos manejaban el mismo conjunto de librerías sin embargo éstas se duplicaban por seguridad y porque normalmente el arquitecto era la única persona que sabía exactamente qué versión de librerías debían ser incluidas en cada uno.</p>
<p>Maven resuelve la mayoría de los problemas de administración de las librerías (JAR) mediante un repositorio centralizado y un mecanismo para la inclusión de dependencias.</p>
<p><strong>¿Qué es una dependencia?</strong></p>
<p>Una dependencia es una referencia en el POM de la librería que se desea incluir en el proyecto. Por ejemplo si deseamos incluir la librería para el manejo de JUnit debemos declararlo de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>dependencies<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>dependency<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>groupId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/groupId<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>artifactId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/artifactId<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>version<span style="color: #ddbb00;">&amp;gt;</span>4.5<span style="color: #ddbb00;">&amp;lt;</span>/version<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>/dependency<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>/dependencies<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>

<p>Como vimos en el artículo anterior los objetos en el repositorio se identifican mediante 3 tags <strong>groupId:artifactId:version</strong></p>
<p><strong>¿Cómo se estructura el repositorio de Maven?</strong></p>
<p>Maven maneja 3 niveles de repositorio: local, empresarial, global.</p>
<p>El repositorio local normalmente conocido como .m2 se guarda localmente en nuestra pc (En Windows se almacena en &#8220;documents and settings&#8221; y en linux en nuestro &#8220;home&#8221;). Dentro de ella encontramos los JAR, WAR, etc en una jerarquía de carpetas que siguen el mismo concepto <strong>groupId:artifactId:version</strong>.</p>
<p>Veamos un ejemplo de un repositorio local estándar:</p>
<p><img src="http://blogs.antartec.com/desarrolloweb/files/2009/05/maven3.gif" alt="Repositorio M2" /></p>
<p>El repositorio Empresarial tiene la misma estructura que el repositorio local con la diferencia que almacena librerías de uso compartido a nivel de red. Los repositorios empresariales normalmente se utilizan cuando se maneja un equipo de desarrolladores que trabaja sobre un conjunto variado de proyectos, los cuales normalmente tienen interdependencia entre ellos y sus librerías.</p>
<p>Los repositorios globales son repositorios públicos que almacenan librerías de uso compartido, como por ejemplo el repositorio mismo de Maven o el repositorio público de JBoss o maven central.</p>
<p>Cuando el proceso de compilación busca las dependencias del proyecto lo primero que hace es buscarlas en el repositorio local, si no las encuentra recurre a sus repositorios empresariales (definido en un archivo .settings.xml) o de red y en caso de no encontrar ahí los JAR necesarios los busca en los repositorios globales.</p>
<p>Es importante notar que una vez ubicado un JAR en alguno de los repositorios externos Maven inmediatamente lo descarga al repositorio local por lo que si uno desea que siempre se actualice el JAR de los repositorios externos debe incluir –U en el comando (ejemplo mvn clean install –U ).</p>
<p>El uso de repositorios Empresariales está íntimamente ligado al uso de la metodología de integración continua por lo que les recomiendo leer la entrada <a href="http://blogs.antartec.com/desarrolloweb/2008/12/integracion-continua-en-proyectos-de-desarrollo/" target="_self">Integración continua</a>.</p>
<p><strong>Ámbito de las dependencias</strong></p>
<p>Existen seis ámbitos en los que una dependencia puede ser declarada limitando así su transitividad:<br />
<strong>Compile</strong>,  es el ámbito por defecto. Las dependencias están disponibles en el proyecto y en sus proyectos dependientes.<br />
<strong>Provided</strong>, se espera que el JDK, la aplicación o el contenedor provea la dependencia.<br />
<strong>Runtime</strong>, la dependencia no es requerida en tiempo de compilación pero sí para la ejecución.<br />
<strong>Test</strong>, son dependencias que son requeridas solo cuando se compila y ejecuta los test.<br />
<strong>System</strong>, similar a provided pero se le debe indicar el jar que contiene la dependencia<br />
<strong>Import</strong>, (a partir a la version 2.0.9) solo es usado en una dependencia del tipo POM en la sección . Indica que el POM utilizado debe ser remplazado con las dependencias que éste tenga en su sección</p>
<p><strong>Cómo usar maven en Netbeans</strong></p>
<p>En Antartec usamos Netbeans como la plataforma por defecto para el desarrollo de aplicaciones web al proveer de manera integrada la mayoría de componentes necesarios para nuestro trabajo.</p>
<p>Pasos para trabajar en Netbeans con Maven</p>
<p>1.	Instalar Netbeans (Lo pueden desargar de <a href="http://www.netbeans.org" target="_blank">www.netbeans.org</a>)<br />
2.	En el menú seleccionar Herramientas – plugins<br />
3.	En la sección &#8220;Plugins disponibles&#8221; seleccionar el plugin Maven y hacer clic en Instalar.<br />
4.	Reiniciar el netbeans, con eso netbeans reconoce y permite crear proyectos maven desde cero.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/05/maven-en-detalle-parte-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Maven en detalle &#8211; Parte 2</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 19:44:20 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[pom]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=166</guid>
		<description><![CDATA[
			
				
			
		
Continuando con nuestro artículo anterior analizaremos la estructura del proyecto y el POM, base de todo proyecto Maven.
La estructura del Proyecto
Dependiendo del tipo de proyecto se pueden tener diferentes estructuras, sin embargo las estructuras más conocidas son la JAR y la WAR.

Veamos la estructura de una aplicación JAR:

Veamos la estructura de una aplicación WAR:

Como puede [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F04%2Fmaven-en-detalle-parte-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F04%2Fmaven-en-detalle-parte-2%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Continuando con nuestro <a href="http://blogs.antartec.com/desarrolloweb/2009/03/maven-en-detalle-parte-1/">artículo anterior</a> analizaremos la estructura del proyecto y el POM, base de todo proyecto Maven.</p>
<p><strong>La estructura del Proyecto</strong></p>
<p>Dependiendo del tipo de proyecto se pueden tener diferentes estructuras, sin embargo las estructuras más conocidas son la JAR y la WAR.<br />
<span id="more-166"></span><br />
Veamos la estructura de una aplicación JAR:</p>
<p><img src="http://blogs.antartec.com/desarrolloweb/files/2009/03/app-test-1.jpg" alt="" /></p>
<p>Veamos la estructura de una aplicación WAR:</p>
<p><img src="http://blogs.antartec.com/desarrolloweb/files/2009/03/app-test-2.jpg" alt="" /></p>
<p>Como puede verse las estructuras son parecidas con la diferencia que la estructura WAR tiene la sección webapp donde irán todos los files jsp, xhtml, html, etc.</p>
<p>En el directorio resources van files de configuración así como el messages.properties.</p>
<p><strong>El POM (Project Object Model)</strong></p>
<p>El POM file es el archivo XML de configuración de cualquier proyecto Maven, en él podemos encontrar información sobre la versión y las dependencias del proyecto así como cualquier otra configuración personalizada para ese proyecto.</p>
<p>El contenido del POM generado después de ejecutar el comando lo podemos ver a continuación:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>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/xsd/maven-4.0.0.xsd&quot;<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>modelVersion<span style="color: #ddbb00;">&amp;gt;</span>4.0.0<span style="color: #ddbb00;">&amp;lt;</span>/modelVersion<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>groupId<span style="color: #ddbb00;">&amp;gt;</span>com.antartec.app<span style="color: #ddbb00;">&amp;lt;</span>/groupId<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>artifactId<span style="color: #ddbb00;">&amp;gt;</span>my-test<span style="color: #ddbb00;">&amp;lt;</span>/artifactId<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>packaging<span style="color: #ddbb00;">&amp;gt;</span>jar<span style="color: #ddbb00;">&amp;lt;</span>/packaging<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>version<span style="color: #ddbb00;">&amp;gt;</span>1.0-SNAPSHOT<span style="color: #ddbb00;">&amp;lt;</span>/version<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>name<span style="color: #ddbb00;">&amp;gt;</span>Maven Quick Start Archetype<span style="color: #ddbb00;">&amp;lt;</span>/name<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>url<span style="color: #ddbb00;">&amp;gt;</span>http://maven.apache.org<span style="color: #ddbb00;">&amp;lt;</span>/url<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>dependencies<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>dependency<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>groupId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/groupId<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>artifactId<span style="color: #ddbb00;">&amp;gt;</span>junit<span style="color: #ddbb00;">&amp;lt;</span>/artifactId<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>version<span style="color: #ddbb00;">&amp;gt;</span>3.8.1<span style="color: #ddbb00;">&amp;lt;</span>/version<span style="color: #ddbb00;">&amp;gt;</span>
           <span style="color: #ddbb00;">&amp;lt;</span>scope<span style="color: #ddbb00;">&amp;gt;</span>test<span style="color: #ddbb00;">&amp;lt;</span>/scope<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>/dependency<span style="color: #ddbb00;">&amp;gt;</span>
   <span style="color: #ddbb00;">&amp;lt;</span>/dependencies<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>/project<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>

<p>Veamos los tags más importantes:</p>
<p><strong>&lt;groupId&gt;</strong> El id del grupo al que pertenece el proyecto.<br />
<strong>&lt;artifactId&gt;</strong> El id del artifact o proyecto (en la mayoría de los casos el nombre del proyecto).<br />
<strong>&lt;version&gt;</strong> La versión del artifact en el grupo especificado.<br />
<strong>&lt;dependency&gt;</strong> Aquí se colocarán todas las dependencias del proyecto.</p>
<p>El POM requiere que estos valores estén definidos ya que ésta es la manera en que Maven los identifica dentro de su repositorio.</p>
<p><strong>Ej. groupId:artifactId:version   com.antartec.app:my-test:1.0-SNAPSHOT</strong></p>
<p>Si no se especifica algunos de los tags (packaging,  name,  url) maven usan los valores por defecto heredados del super POM del cual heredan todos los proyectos (hablaremos sobre la herencia más adelante).</p>
<p><strong>Construyamos el proyecto</strong></p>
<p>Ejecutando el siguiente comando se construye el proyecto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn clean <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>A diferencia del comando archetype:create este comando es de una sola palabra que especifica la fase que debe ejecutarse. Una fase corresponde a un paso del ciclo de vida de maven. Por ejemplo</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn compile</pre></div></div>

<p>Ejecutará las siguientes fases:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">validate
generate-sources
process-sources
generate-resources
process-resources
compile</pre></div></div>

<p>Existe muchas fases en Maven sin embargo listo las más utilizadas a continuación:</p>
<ul>
<li><strong>validate</strong> – valida que el proyecto es correcto y tiene toda la información necesaria.</li>
<li><strong>compile</strong> – compila el código fuente.</li>
<li><strong>test</strong> – compila el código y ejecuta los unit test correspondientes. Sin embargo no es requisito para que el proyecto sea desplegado.</li>
<li><strong>package</strong> – toma el código compilado y lo empaqueta en un formato distribuible como JAR o WAR.</li>
<li><strong>integration-test</strong> – Despliega el proyecto si es necesario en ambiente de pruebas donde se puedan correr pruebas de integración.</li>
<li><strong>verify</strong> – ejecuta cualquier verificación para cumplir los parámetros de calidad.</li>
<li><strong>install</strong> – instala el jar o war en el repositorio local para que otras aplicaciones locales la puedan usar.</li>
<li><strong>deploy</strong> – copia el jar o war a un repositorio remoto para que pueda ser usado por otro desarrollador o proyecto.</li>
</ul>
<p>Si desean ver la lista completa de fase las pueden encontrar en <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference" target="_blank">lifecycle</a></p>
<p>Para un desarrollo local bastará con utilizar <strong>mvn clean install</strong>.</p>
<p>En nuestra siguiente entrega hablaremos sobre el manejo de las dependencias y como usar el proyecto junto con nuestro IDE favorito.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/04/maven-en-detalle-parte-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Maven en detalle &#8211; Parte 1</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/03/maven-en-detalle-parte-1/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/03/maven-en-detalle-parte-1/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 22:49:40 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=127</guid>
		<description><![CDATA[
			
				
			
		
Comenzamos la saga Maven compuesta por una serie de artículos en donde detallaremos como instalar, construir, desplegar un pequeño proyecto piloto.
En artículos anteriores hemos hablado sobre las ventajas de Maven y como es que éste encaja dentro la de estructura de integración continua en el desarrollo de proyectos por lo que pasaremos directamente a los [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F03%2Fmaven-en-detalle-parte-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F03%2Fmaven-en-detalle-parte-1%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Comenzamos la saga <a href="http://maven.apache.org/">Maven</a> compuesta por una serie de artículos en donde detallaremos como instalar, construir, desplegar un pequeño proyecto piloto.</p>
<p>En artículos anteriores hemos hablado sobre las ventajas de <a href="http://blogs.antartec.com/opensource/2008/11/antartec-open-source-maven/" target="_blank">Maven</a> y como es que éste encaja dentro la de estructura de <a href="http://blogs.antartec.com/desarrolloweb/2008/12/integracion-continua-en-proyectos-de-desarrollo/" target="_blank">integración continua en el desarrollo de proyectos</a> por lo que pasaremos directamente a los detalles.</p>
<p><span id="more-127"></span><br />
<strong>Empecemos por instalar Maven</strong></p>
<p>Tenemos que ir al sitio web de la Maven y descargar la última versión (<a href="http://maven.apache.org/download.html" target="_blank">http://maven.apache.org/download.html</a>),  es necesario contar con el JDK previamente instalado.</p>
<p>Seguimos las instrucciones de la página para configurar las variables de entorno correspondientes para máquinas con Windows o Linux.</p>
<p><strong>Una vez instalado, construiremos nuestro primer proyecto</strong></p>
<p>Una vez instalado maven en nuestro computador podemos empezar por construir nuestro primer proyecto de prueba al cual llamaremos <strong>app-test</strong>.</p>
<p>Ejecutamos el siguiente “Archetype” para crear un jar en la línea de comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn archetype:create
<span style="color: #660033;">-DarchetypeGroupId</span>=org.apache.maven.archetypes
<span style="color: #660033;">-DgroupId</span>=com.antartec
<span style="color: #660033;">-DartifactId</span>=app-test</pre></div></div>

<p>Los archetype son simples plugins de maven, uno de ellos es el archetype create, el cual permite crear un proyecto base al proporcionar la plantilla del mismo.</p>
<p>El archetype create recibe una serie de parámetros los cuales son:</p>
<ul>
<li><strong>archetypeGroupId</strong>, usar este parámetro es una manera abreviada de crear un proyecto de tipo jar, sin embargo cuando se usan archetypes creados por uno mismo se tiene que especificar los tres parámetros de todo archetype (groupId, artifactId,version) de la siguiente manera.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn archetype:create
<span style="color: #660033;">-DarchetypeGroupId</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>lt;archetype-groupId<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
<span style="color: #660033;">-DarchetypeArtifactId</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>lt;archetype-artifactId<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
<span style="color: #660033;">-DarchetypeVersion</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>lt;archetype-version<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
<span style="color: #660033;">-DgroupId</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>lt;my.groupid<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
<span style="color: #660033;">-DartifactId</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>lt;my-artifactId<span style="color: #000000; font-weight: bold;">&amp;</span>gt;</pre></div></div>

<ul>
<li><strong>groupId</strong>, es usado como identificador del conjunto de librerías en este caso hemos usado <strong>com.antartec</strong> como  nombre para nuestro paquete de librerías.</li>
<li><strong>artifactId</strong>, es usado como identificador particular de una librería en particular.</li>
</ul>
<p>Si es la primera vez que se ejecuta un comando Maven éste tomará algo de tiempo pues Maven creará el repositorio inicial .m2 y descargará todas las librerías necesarias para construir el proyecto.</p>
<p>Si deseamos crear un proyecto war en vez de un jar ejecutaremos el siguiente “Archetype” en la línea de comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mvn archetype:create
<span style="color: #660033;">-DarchetypeArtifactId</span>=maven-archetype-webapp
<span style="color: #660033;">-DgroupId</span>=com.antartec.app
<span style="color: #660033;">-DartifactId</span>=webapp-test</pre></div></div>

<p>En este caso hemos ejecutado un archetype distinto que contiene la plantilla de un proyecto web.</p>
<p>En el siguiente artículo analizaremos la estructura del POM generado, base de cualquier proyecto Maven.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/03/maven-en-detalle-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Performance: Uso de @Create</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/02/seam_uso_de_create/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/02/seam_uso_de_create/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 22:11:47 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=107</guid>
		<description><![CDATA[
			
				
			
		
En este post me gustaría hacer una pequeña contribución al post “Performance: ¿Por qué usar @Factory en vez de getters?” de Seam City sobre el uso de @Factory para la obtención de listas.

En el post se menciona que los valores obtenidos por EL no se guardan en cache y ésto es un problema sobre todo [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F02%2Fseam_uso_de_create%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F02%2Fseam_uso_de_create%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>En este post me gustaría hacer una pequeña contribución al post <a href="http://seamcity.madeinxpain.com/archives/performance-%C2%BFpor-que-usar-factory-en-vez-de-getters" target="_blank">“Performance: ¿Por qué usar @Factory en vez de getters?”</a> de Seam City sobre el uso de @Factory para la obtención de listas.<br />
<span id="more-107"></span><br />
En el post se menciona que los valores obtenidos por EL no se guardan en cache y ésto es un problema sobre todo cuando se acceden a listas que son cargadas desde la base de datos.</p>
<p>Para resolver el problema el post plantea 2 opciones:</p>
<p>Por patrón de carga lazy loading</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Name</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;userManager&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">List</span> list<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">List</span> getUserList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">list</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">list</span> <span style="color: #339933;">=</span> createUserList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">return</span> list<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y una mejor manera utilizando las anotaciones @Out y @Factory</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #009900;">&#123;</span>
&nbsp;
  @Factory<span style="color: #009900;">&#40;</span>value <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;userList&quot;</span>, scope <span style="color: #339933;">=</span> ScopeType.<span style="color: #006633;">PAGE</span><span style="color: #009900;">&#41;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">List</span> getUserList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">list</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">list</span> <span style="color: #339933;">=</span> createUserList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #000000; font-weight: bold;">return</span> list<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sin embargo existe una tercera solución que es bastante más clara y sobre todo sigue la convención con respecto a la creación de objetos y es utilizar la anotación @Create</p>
<p>El código es el siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">&nbsp;
@<span style="color: #003399;">Name</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;userManager&quot;</span><span style="color: #009900;">&#41;</span>
@Scope<span style="color: #009900;">&#40;</span>ScopeType.<span style="color: #006633;">PAGE</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>User<span style="color: #339933;">&gt;</span> list<span style="color: #339933;">;</span>
&nbsp;
  @Create
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> loadInitData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">list</span> <span style="color: #339933;">=</span> createList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> List<span style="color: #339933;">&lt;</span>User<span style="color: #339933;">&gt;</span> getList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> list<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setList<span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span>User<span style="color: #339933;">&gt;</span> list<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">list</span> <span style="color: #339933;">=</span> list<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La anotación @Create nos permite declarar que un método se ejecute al momento que un componente es creado. Momento apropiado para cargar toda la información que sólo debe ser obtenida una vez.</p>
<p>La anotación @Scope(ScopeType.PAGE) nos permite establecer un contexto para el componente de seam, en este caso que el componente exista mientras la página esta activa. Se pueden utilizar otros contextos como por ejemplo Conversation o Session, sin embargo no es recomendable usar el contexto session a menos que sea estrictamente necesario pues sin una adecuada adminstración la memoria requerida por aplicación puede dispararse.</p>
<p><strong>A modo de conclusión</strong></p>
<p>Es una buena práctica centralizar la información de carga estática en un solo método y combinado con el scope Page mejor, pues el uso de memoria en el servidor es mínimo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/02/seam_uso_de_create/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pop up windows en las aplicaciones web</title>
		<link>http://blogs.antartec.com/desarrolloweb/2009/01/pop-up-windows-en-las-aplicaciones-web/</link>
		<comments>http://blogs.antartec.com/desarrolloweb/2009/01/pop-up-windows-en-las-aplicaciones-web/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 19:59:23 +0000</pubDate>
		<dc:creator>Giancarlo Corzo</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[popup]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://blogs.antartec.com/desarrolloweb/?p=73</guid>
		<description><![CDATA[
			
				
			
		
Introducción
Las ventanas Pop up siempre han sido un problema en el desarrollo de aplicaciones web, las que proporciona el browser son poco prácticas al ser mini ventanas que se abren de manera separada a la aplicación, en un browser independiente y que no comparten información de manera natural. (Solamente mediante javascript).
Además recientemente éstas han sido [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F01%2Fpop-up-windows-en-las-aplicaciones-web%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblogs.antartec.com%2Fdesarrolloweb%2F2009%2F01%2Fpop-up-windows-en-las-aplicaciones-web%2F&amp;source=antartec&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p><strong>Introducción</strong></p>
<p>Las ventanas Pop up siempre han sido un problema en el desarrollo de aplicaciones web, las que proporciona el browser son poco prácticas al ser mini ventanas que se abren de manera separada a la aplicación, en un browser independiente y que no comparten información de manera natural. (Solamente mediante javascript).</p>
<p>Además recientemente éstas han sido utilizadas como una manera de spam publicitario al activarse al momento de ingresar a la página web, lo que hace que la navegación sea realmente molesta. Dada esta situación los browser decidieron desarrollar sistemas que bloqueen los Pop ups de toda aplicación sin importar si estos eran relevantes o no.</p>
<p>Es por esto que multiples frameworks de javascript como yui, ext, richfaces (aunque no es de javascript tambien provee Pop up windows) han desarrollado Pop up windows basados en un div flotante y que son bastante útiles.</p>
<p><span id="more-73"></span><br />
<strong>¿Qué hace que un Pop up window sea realmente útil?</strong></p>
<p>Un Pop up window utilizado dentro de una aplicación es útil en la medida en que pueda cumplir los mismos requerimientos que tendría un Dialog hecho en Java o C#.</p>
<p>Por lo tanto las características que deben tener son:</p>
<ul>
<li>Deben poder ser invocados desde cualquier lugar (en este caso desde cualquier página web).</li>
<li>Ser autocontenibles (que no se necesite registrar información extra para que funcionen).</li>
<li>En caso que necesiten retornar parámetros, estos debe poder ser obtenidos en la página que lo llamo.</li>
<li>Una extensión del punto anterior seria que los Pop up window puedan intercambiar información entre ellos.</li>
<li>Capacidad de recibir parámetros.</li>
</ul>
<p><strong>Nuestra solución</strong></p>
<p>Hemos planteado nuestra solución de la siguiente manera:</p>
<p>Para cumplir con el primer y tercer objetivo tenemos un objeto javascript que es omnipresente a todas las páginas y se encarga de: crear, mostrar y cerrar los Pop up y además maneja los parámetros de retorno.</p>
<p>Para cumplir con el segundo objetivo el contenido del modal panel esta en otra página web y ésta es mostrada a través de un iframe dentro del modal.</p>
<p>Para cumplir con el quinto objetivo simplemente se los pasamos como parámetros de url a la página dentro del iframe.</p>
<p>Un ejemplo de cómo instanciamos un objeto:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> editarObjeto<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  ManejadorVentanas.<span style="color: #660066;">mostrar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
   id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'idPanel'</span><span style="color: #339933;">,</span>
   titulo<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Editar objeto'</span><span style="color: #339933;">,</span>
   src<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/contenido/editarObjeto.xhtml?id='</span> <span style="color: #339933;">+</span> id<span style="color: #339933;">,</span>
   ancho<span style="color: #339933;">:</span> <span style="color: #CC0000;">500</span><span style="color: #339933;">,</span>
   alto<span style="color: #339933;">:</span> <span style="color: #CC0000;">350</span><span style="color: #339933;">,</span>
   callback<span style="color: #339933;">:</span> refrescarLista
 <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como puede verse la invocación es muy sencilla y solo se requiere tener la página en donde se desarrollará el contenido.</p>
<p>La función de callback permite obtener los parámetros de retorno, de esta manera:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> refrescarLista <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #003366; font-weight: bold;">var</span> rpta <span style="color: #339933;">=</span> ManejadorVentanas.<span style="color: #660066;">obtenerParametros</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'idPanel'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'rptaModal'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
   <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>rpta<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> valorRetornado <span style="color: #339933;">=</span> ManejadorVentanas.<span style="color: #660066;">obtenerParametros</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'idPanel'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'valor1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #006600; font-style: italic;">// hacer algo mas.</span>
   <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>A manera de conclusión</strong></p>
<p>No importa con que librería de javascript estén trabajando (YUI, JQuery, ExtJS, Dojo, etc) estos principios básicos deben poderse cumplir para poder sacar el máximo provecho de las Pop up windows dentro de una aplicación web.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.antartec.com/desarrolloweb/2009/01/pop-up-windows-en-las-aplicaciones-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

