14 jul 2012

Reemplazo de jsp’s con velocity


1.-Descargar  velocity-tools-2.0.zip de la página de apache http://velocity.apache.org/download.cgi.

2.-Hacer un proyecto dinámico:
              1.1 abrimos el eclipse  File==>New==>Other==>Web==>Dynamic Web Project==>Next

Seleccionaremos apache Tomcat v6.0 . y escoger versión 2.5.
Para está versión de Tomcat es importante escoger 2.5 (con 2.3 no funcionaría).
Nuestro proyecto tendrá la siguiente pinta:



3.-Descomprimir velocity-tools-2.0.zip y añadir las  jar de la carpeta lib , en la carpeta lib de nuestro proyecto.Añadirlas al build path.
4.-Ahora vamos a añadir el servidor de aplicaciones.Para ello Windows==>show view==>Server==>Se abrirá una pestañita con el nombre server
Botón drch==>new==>Server==>Seleccionar Tomcat v6.0 Server
.


Next==>Add el proyecto==>Finish


En las propiedades del proyecto ,podemos ver en el apartado de server que tenemos el server asociado .En este caso Tomcat 6.



5.-Ahora basándonos en el tutorial “Struts in action” añadiremos al fichero web.xml
Las siguientes líneas:
<!-- Define Velocity template compiler -->
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class> 
</servlet>
<!-- Map *.vm files to Velocity -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>


6.-Ahora vamos a sustituir la clásica index.jsp por un archivo vm que llamaremos index.vm.
El contenido de nuestra index.vm será:
#set($nombre="Patricia")
$nombre
7.-Ahora en el web.xml vamos a mapear index.vm ,quedando el archivo web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Velocity</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>index.vm</welcome-file>
  </welcome-file-list>
  <!-- Define Velocity template compiler -->
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
 
</servlet>
<!-- Map *.vm files to Velocity -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
</web-app>

8.-Ya tenemos el proyecto listo .Arrancamos el servidor dando en la flechita verde

 
Nos ponemos encima del proyecto y damos a la flechita de run as..


Seleccionamos run on server ==>OK


 Y ya podemos ver la index.vm








Desarrollo con alfresco


En alfresco cómo en otros gestores documentales o gestores de contenidos para realizar cambios es posible sustituir ficheros o añadir contenido a algún fichero. Y claro que funciona incluso en algunos casos de esta forma detectaremos que lo que está mal es el mapeo pero no es una buena práctica. La Regla de oro es Nunca poner nuestros archivos personalizados sobre el despliegue.
¿Qué qué es el despliegue y a que me refiero? Cuando arrancamos Alfresco por primera vez, lo que realmente está haciendo es coger el alfresco.war y el share.war que hay dentro de la carpeta webapps  los abre y descomprime el primero en la carpeta alfresco y el segundo en la carpeta share. Esas carpetas son el despliegue
Cada vez que arranquemos nuestro Alfresco leerá y cargará los archivos que haya en ambas carpetas, es decir  \webapps\alfresco\* para alfresco, o si accedemos al share  \webapps\share\*  
Normalmente las personas hacen una mala práctica en base a esto que os estoy explicando y el razonamiento erróneo suele ser: Si lo primero que carga es lo que hay en el despliegue, voy a copiar mi archivo y lo sustituyo por el que haya ahí así cuando arranque alfresco lo carga. 
MAL HECHO, imaginaros que os tiráis horas y horas de curro y vais metiendo dentro de esas carpetas vuestros archivos modificados. Imaginad que tenéis que actualizar por el motivo que sea… Cuando pongáis el alfresco.war y el share.war nuevo para actualizar, al arrancar los descomprimirá y los cargará en \webapps\alfresco\* y  \webapps\share\*  borrando todo lo que hubiera en ellas y con ello todo vuestro trabajo.

¿Entonces no hay alternativa? Sí que la hay. La solución a ello (y con ello la buena práctica) es copiar vuestros archivos modificados dentro de 
$ALF_HOME/shared/classes/alfresco/extension para las personalizaciones de alfresco y $ALF_HOME/shared/classes/alfresco/web-extension para las personalizaciones del share

Creo que esto os ayudará a más de uno y además me da que es uno de los pilares básicos para cuando queramos hacer nuestras propias personalizaciones.

Sabiendo esto lo que haremos será instalarnos eclipse y crearemos un proyecto que mediante una tarea ant  empaquetará en un jar  los cambios que realizaremos para cada uno de los ejercicios.


1.-Vamos a estructurar de está forma:


Por lo tanto crearemos las carpetas partiendo de la carpeta alfresco que alojaremos en C:/.
-Carpeta alfresco34:
Se trata de la instalación de alfresco34d como NO SERVICIO para ello modificaremos:
                -la ruta de %ALF_HOME% en el archivo alfresco.bat, en la ruta C:/alfresco/alfresco34
set ALF_HOME=c:\alfresco\alfresco34\
-la ruta de la carpeta java en el archivo setenv.bat  en la ruta C:\alfresco\alfresco34\tomcat\bin
set JAVA_HOME=C:\alfresco\alfresco34\java
-Cambiar todas las rutas en el archivo de propiedades  alfresco-global.properties, en la ruta C:\alfresco\alfresco34\tomcat\shared\classes
dir.root=C:/alfresco/alfresco34/alf_data
ooo.exe=C:/alfresco/alfresco34/openoffice/App/openoffice/program/soffice.exe
img.root=C:/alfresco/alfresco34/imagemagick
swf.exe=C:/alfresco/alfresco34/swftools/pdf2swf.exe
jodconverter.officeHome=C:/alfresco/alfresco34/openoffice/App/openoffice
-Carpeta eclipse:
En esta carpeta descomprimiremos el programa eclipse su ruta es C:/alfresco/eclipse
-Carpeta java:
En esta carpeta alojaremos los proyectos

-Crear un proyecto:
Ahora vamos a extender alfresco a través de un proyecto en eclipse. Cómo bien hicimos referencia anteriormente, para extender alfresco deberemos reproducir en la carpeta extensión la estructura de la carpeta alfresco de despliegue. En el caso que nos desviemos de reproducir dicha estructura deberemos de reflejar los cambios  cambiando las rutas de mapeado. Empezamos, creamos un proyecto java en eclipse  y renombramos  la carpeta src a source. Añadimos las carpetas built ,dist y lib.
-Carpeta source :Es la carpeta en la que reproduciremos la estructura de despliegue de la carpeta alfresco
-Carpeta dist: En está carpeta se alojará el jar creado en el deploy de la tarea ant.
-Carpeta lib: en está carpate alojaremos las librerías que se necesiten para realizar extenxiones de alfresco.
 
Alfresco es una plataforma flexible para desarrollar aplicaciones de gestión de
Contenidos. El primer paso en el proceso para el diseño de  una aplicación con alfresco es diseñar el espacio y el contenido de este. No es preciso que espacio y contenido estén vinculados pudiendo existir un contenido sin necesidad de definir un espacio para éste. Aunque la más común sería definir espacio y contenido.
El modelo de contenido provisto por Alfresco es bastante detallado. De hecho, para
necesidades de gestión documental básicas probablemente sea suficiente. No obstante,
se estaría desaprovechando la potencia y funcionalidad de tener un modelo
personalizado a las necesidades del negocio. Tanto espacio como contenido nacen de la idea de definir metadatos propios.
¿Qué son metadatos asociados a un archivo o carpeta?
Son los datos sobre los datos. Un sencillo ejemplo: las fichas de una biblioteca (metadatos) y los libros (datos). Mientras que las fichas tienen toda la información relacionada con el autor, el título, el ISBN, el año, la editorial, en el libro está el contenido que normalmente un usuario buscará.
Así mismo sucede con otros elementos digitales, por ejemplo las fotografías digitales y las canciones en formato MP3. Seguramente tú tienes una cámara digital con la que tomas fotografías. Lo que pocas veces nos enteramos es que a la vez que la cámara captura las imágenes, va guardando en forma de metadatos, información muy interesante de cómo fue tomada la fotografía: fecha, hora, diafragma, velocidad, uso de flash, modo de captura, entre otros datos, uno de ellos próximo a llegar: geoposicionamiento satelital.
¿Qué es un espacio?
Un espacio en alfresco viene a ser una carpeta .Un tipo de carpeta determinada, ya que al extender el espacio podremos definir los metadatos asociados a ella, aplicarle reglas, permisos... Puede Contener ficheros o sub-espacios organizados por jerarquías.
¿Qué es un tipo de contenido?
Los tipos presentan un gran parecido a las clases en el mundo de orientación a objetos. Pueden usarse para representar objetos de nuestro modelo de negocio: Tienen propiedades y pueden heredar de un tipo base. Contenido (cm:content) , Persona (cm:person) o Carpeta (cm:folder) son tres tipos importantes definidos por Alfresco. Los tipos personalizados están limitados únicamente por nuestra imaginación y requerimientos de negocio. Factura, Receta médica o Película serían ejemplos de tipos personalizados.
¿Cómo se crean?
Los pasos a realizar cada vez que queramos incorporar un nuevo tipo de contenido en
Alfresco son:
1. Definición el tipo de contenido personalizado.
2. Extender el modelo de contenido con el nuevo tipo de contenido.
3. Configurar el cliente Web para que sea capaz de reconocer el nuevo tipo de
contenido.
4. Reiniciar Alfresco para que los cambios sean efectivos.
5. Crear contenido basado en el nuevo tipo de contenido

1.- Definición del tipo de contenido personalizado.
Consiste en determinar qué propiedades, aspectos y asociaciones conforman nuestro tipo de contenido personalizado. En nuestro caso, nuestra “carpeta” además de las propiedades básicas de un espacio, queremos que tenga las siguientes:


Tipo*************Nombre****************Etiqueta

Texto (text)******  nombre **************** Nombre
Texto (text)******  apellido1 **************** Apellido1
Texto (text)******  apellido2 **************** Apellido2
Texto (text)******  direccion *************** Direccion
Fecha (date)****** fecha de Nacimiento*****  FechaNacimiento
Texto (text)******  mail******************* eMail
Texto(text)******  teléfono **************** Telefono                              

Podemos reutilizar aspectos existentes en el modelo de contenido de Alfresco, para incorporar por defecto propiedades que ya están encapsuladas en dichos aspectos.

2.- Extender el modelo de contenido con el nuevo tipo de contenido.
Una vez definido nuestro tipo de contenido, lo siguiente es extender el modelo de contenido con una representación XML de nuestro tipo de contenido. 

Los tipos de propiedades son los siguientes:
Any - Undefined 
Name - Name qualified by Namespace 
Guid - Globally unique ID 
Text - 
Content -  
Date - 
DateTime - 
Boolean - 
Int - 
Long -
Float - 
Double 
Category - Location within Classification 
Noderef – Node reference
Path -path

Ir a: C:\%ALF_HOME%\tomcat\shared\classes\alfresco\extension
Copiar y renombrar el customModel.xml.sample a ejemploModel.xml y dejar así en primer término:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Custom Model -->
<!-- Note: This model is pre-configured to load at startup of the Repository.  So, all custom -->
<!--       types and aspects added here will automatically be registered -->
<modelname="ejercicio1:modeloPersonalizado" xmlns="http://www.alfresco.org/model/dictionary/1.0">
<!-- Optional meta-data about the model -->
<description>Ejemplo Model</description>
<author>alfresco</author>
<version>1.0</version>
<imports>
    <!-- Import Alfresco Dictionary Definitions -->
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
<!-- Import Alfresco Content Domain Model Definitions -->
<import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
</imports>

<!-- Introduction of new namespaces defined by this model -->
<!-- NOTE: The following namespace custom.model should be changed to reflect your own namespace -->
<namespaces>
<namespaceuri="http://www.ejemplo.model/alfresco/demo" prefix="ejercicio1"/>

Después vamos a crear nuestro tipo de verdad (hasta ahora sólo hemos definido nuestro modelo personalizado "types")

En el archivo contentModel.xml dentro de C:\%ALF_HOME%\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\model (
están  definidas todas las propiedades y tipos de nodos que soporta alfresco por defecto:
-Podemos usar este fichero como referencia

<types>
   <!-- Definicion de los tipos de contenido personalizados -->   
<!-- Definicion del tipo de contenido ejercicio1:carpeta -->
<type name="ejercicio1:espacio">
<title>Ejercicio 1: nuevo tipo de espacio </title>
<parent>cm:folder</parent>
<properties>
<property name="ejercicio1: Nombre">
<title>Nombre</title>
<type>d:text</type>
</property>
<property name="ejercicio1 :Apellido1">
<title>Apellido 1</title>
<type>d:text</type>
</property>
<property name="ejercicio1:Apellido2">
<title>Apellido 2</title>
<type>d:text</type>
</property>
<property name="ejercicio1:FechaNacimiento">
<title>Fecha de nacimiento</title>
<type>d:date</type>

 </property>
<property name="ejercicio1 :Direccion">
<title>Direccion</title>
<type>d:text</type>
</property>
<property name="ejercicio1 :FechaNacimiento">
<title>Fecha de nacimiento</title>
<type>d:date</type>
</property>
<property name="ejercicio1 :eMail ">
<title>Mail</title>
<type>d:text</type>
</property>
<property name="ejercicio1 :Telefono ">
<title>Telefóno</title>
<type>d:text</type>
</property>
</properties>
</type>
</types>
<aspects>
<!-- Definicion de los aspectos personalizados -->
</aspects>
</model>

Si nos fijamos, el tipo que hemos definido hereda del tipo cm:folder
(<parent>cm:folder</parent>), es decir, contiene todas las propiedades y funcionalidad
de un espacio, pero además contiene las propiedades que hemos especificado nosotros.
Este fichero lo llamaríamos como quisiéramos, por ejemplo ejemploModelo.xml, y lo
guardaríamos en el directorio extension  

Hay que tener en cuenta que el XML que hemos creado para definir nuestro modelo de
contenido, debe ir acompañado de un fichero de contexto que se encargue de incluir en
la lista modelos el fichero que acabamos de crear.
Para ello, en el mismo directorio extension debemos crear un fichero de contexto similar
a este:
Fichero ejemploModelo-context.xml

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<!-- Registro de nuevos modelos -->
<bean id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap"
depends-on="dictionaryBootstrap">
<property name="models">
<list>
<value>alfresco/extension/model/ejemploModelo.xml</value>
</list>
</property>
</bean>
</beans>

Como se observa, incluimos el modelo ejemploModelo.xml en la lista de modelos
(models) para que se cargue en el diccionario de Alfresco al arrancar.
Este fichero es importante que termine en –context.xml ya que es la terminación que
Alfresco reconoce para interpretar los ficheros de contexto.

3.- Configurar el cliente Web para que sea capaz de reconocer el nuevo tipo de contenido.
Ahora debemos asegurarnos que el cliente Web reconoce el nuevo tipo de contenido y visualiza las propiedades en la pantalla pertinente. Para ello, debemos ir al fichero web-client-config-custom.xml que se encuentra en el mismo directorio extension.
Debemos incluir los siguientes fragmentos:

3.a) Si queremos que el nuevo tipo aparezca como opción de tipo de contenido en el wizard de reglas de contenido, deberemos incluir lo siguiente:

<config evaluator="string-compare" condition="Action Wizards">
<subtypes>
<type name="ejercicio1:espacio"></type>
</subtypes>
</config>

Esto hará que cuando queramos crear una regla de contenido cuya condición se base en
el tipo de contenido del objeto que dispara la regla, nos aparezca nuestro tipo
personalizado como una posible condición.
3.b) Si queremos tener la posibilidad de convertir los espacios existentes tendremos que
añadir lo siguiente:
<config evaluator="string-compare" condition="Action Wizards">
<subtypes>
<type name="ejercicio1:espacio"></type>
</subtypes>
</config>

3.c) Si queremos que nos aparezca el nuevo tipo de espacio en el asistente de creación
de espacio, debemos incluir las siguientes líneas en web-client-config-custom.xml:

<config evaluator="string-compare" condition="Space Wizards">
<folder-types>
<type name="ejercicio1:espacio"></type>
</folder-types>
</config>

3.d) Por último, lo más probable es que nos interese editar las propiedades que hemos
definido (si no, para qué íbamos a crear un tipo de contenido con propiedades nuevas?).
Para ello:
 
<config evaluator="node-type" condition="ejercicio1:espacio">
<property-sheet>
<show-property name="ejercicio1:Nombre"></show-property>
<show-property name="ejercicio1:Apellido1"></show-property>
<show-property name="ejercicio1:Apellido2"></show-property>
<show-property name="ejercicio1: Direccion "></show-property>
<show-property name="ejercicio1: FechaNacimiento "></show-property>
<show-property name="ejercicio1: eMail "></show-property>
<show-property name="ejercicio1: Telefono"></show-property>
</property-sheet>
</config>

Con lo que el fichero web-client-config-custom.xml queda de la siguiente manera:

<alfresco-config>
<config evaluator="string-compare" condition="Action Wizards">
<subtypes>
<type name="ejercicio1:espacio"></type>
</subtypes>
</config>
<config evaluator="string-compare" condition="Action Wizards">
<especialise-types>

<type name="ejercicio1:espacio"></type>
</especialise-types>
</config>
<config evaluator="string-compare" condition="Space Wizards">
<folder-types>
<type name="ejercicio1:espacio"></type>
</folder-types>
</config>
<config evaluator="node-type" condition="ejercicio1:espacio">
<property-sheet>
<show-property name="ejercicio1:Nombre"></show-property>
<show-property name="ejercicio1:Apellido1"></show-property>
<show-property name="ejercicio1:Apellido2"></show-property>
<show-property name="ejercicio1: Direccion "></show-property>
<show-property name="ejercicio1: FechaNacimiento "></show-property>
<show-property name="ejercicio1: eMail "></show-property>
<show-property name="ejercicio1: Telefono"></show-property>
</property-sheet>
</config>
</alfresco-config>

4.- Reiniciar Alfresco.
5.‐ Crear un espacio basado en el nuevo tipo de contenido.
Para crear un nuevo espacio.
Vamos a Espacio de empresa en el espacio de trabajo


 O a través de la opción  Examinar elementos en su espacio personal

 
 
Crear / Asistente Avanzado de Espacio


 
Escoger desde cero

 
‐ A la hora de seleccionar qué tipo de espacio queremos, nos debería aparecer un
nuevo tipo de espacio llamado “Ejercicio1:nuevo tipo de espacio” (que es el título que le hemos dado a nuestro tipo de contenido).
‐ Introducimos las propiedades básicas del espacio y pulsamos Finalizar.
Para editar las propiedades específicas de nuestro espacio:
‐ Ver detalles del espacio.



 
-Escogemos la opción de detalle (el tercer icono) .Podemos ver las propiedades especificas de espacio que introdujimos antes. Ahora vamos a editar los demás valores introducidos para ello damos en el icono indicado con una flecha.



 
NOTAS
Lo más habitual no es crear un tipo de contenido que herede de cm:folder, sino que
herede de tipo cm:content. Generalmente, los espacios que vienen en Alfresco
satisfacen todas las necesidades de los usuarios. Es más usual que nos encontremos
con la necesidad de definir un nuevo tipo de contenido que encapsule propiedades
adicionales. Lo veremos en el siguiente ejercicio.

alfrescoexplorer  dispone de una consola para poder gestionar los modelos nuevos para poder utilizarla tendremos que llevar a cabo unos cuantos pasos.

Una vez introducidos todos los ficheros xml en sus rutas correspondientes ejecutar por consola en la ruta: C:\Alfresco\tomcat\shared\classes  esto:

java -cp ".;C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\lib\*;C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes" org.alfresco.repo.dictionary.TestModelalfresco/extension/ejemploModel.xml
Por consola veremos:

C:\alfresco\alfresco34\tomcat\shared\classes>java -cp ".;C:\alfresco\alfresco34\
tomcat\webapps\alfresco\WEB-INF\lib\*;C:\alfresco\alfresco34\tomcat\webapps\alfr
esco\WEB-INF\classes" org.alfresco.repo.dictionary.TestModel alfresco/extension/
ejemploModel.xml
Testing dictionary model definitions...
 alfresco/model/dictionaryModel.xml
 alfresco/model/systemModel.xml
 org/alfresco/repo/security/authentication/userModel.xml
 alfresco/model/contentModel.xml
 alfresco/model/wcmModel.xml
alfresco/model/applicationModel.xml
 alfresco/model/bpmModel.xml
 alfresco/model/wcmAppModel.xml
 alfresco/extension/ejemploModel.xml
Models are valid.


Reiniciando alfresco ya tenemos disponible el nuevo tipo de dato, al darle a Añadir contenido.
Consola para ver modelos definidos:
http://127.0.0.1:8080/alfresco/faces/jsp/admin/repoadmin-console.jsp
Desde el alfrescoexplorer, se pueden subir los modelos desde Diccionario de datos > Modelos. Habría que darle el fichero xml ejemploModel.xml que generamos antes, creo que usando la opción Añadir contenido.
Ahora vamos a hacer el mismo ejercicio pero empaquetando en un jar mediante un proyecto creado en el eclipse con una tarea ant, apropiada para este caso.
Creamos un proyecto java en el eclipse como indicamos anteriormente. 
Con la siguiente estructura:



















Tarea ant:

<?xml version="1.0"?>

<project name="alfresco-Ejercicio1" default="dist" basedir=".">
     
      <property name="build.dir" value="build"/>
      <property name="dist.dir" value="dist"/>
      <property name="source.dir" value="source"/>
      <property name="lib.dir" value="lib"/>
      <property name="file.jar" value="alfresco-Ejercicio1.jar"/>
      <property name="deploy.local.dir" value="C:\alfresco\alfresco34\tomcat\webapps\alfresco\WEB-INF\lib"/>      

      <target name ="clean">
      <echo message = "Creando directorios de construccion y distribucion..."/>
            <delete dir="${build.dir}" />
            <mkdir dir="${build.dir}" />
            <mkdir dir="${dist.dir}" />
      </target>
     
    <target name="compile" depends="clean" description="compilation process started">
      <echo message="Compilando fuentes..."/>
        <javac srcdir="${source.dir}" destdir="${build.dir}">
            <classpath>
                <path refid="project.classpath"/>
            </classpath>
                  <include name="**/*.java" />
        </javac>
    </target>

      <target name="build" depends="compile">
      <echo message = "Copiando fuentes al directorio de construccion..."/>
            <copy todir="${build.dir}">
            <fileset dir="${source.dir}" excludes=".svn" includes="**/*.xml,**/*.properties"/>
            </copy>
      </target>
     
      <target name="jar" depends="build">
      <echo message = "Construyendo jar..."/>
            <jar jarfile="${dist.dir}/${file.jar}">
                  <fileset dir="${build.dir}"/>
            </jar>
      <echo message = "Borrando directorio de construccion..."/>
      </target>
     
      <target name="dist" depends="clean,compile,build,jar" />

     
     
      <target name="deploy-local" depends="dist">
      <echo message = "Desplegando libreria en local..."/>
            <copy file="${dist.dir}/${file.jar}" todir="${deploy.local.dir}" />
      </target>

</project> 

Al ejecutar la tarea ant en la ruta C:\alfresco\alfresco34\tomcat\webapps\alfresco\WEB-INF\lib .Se nos cargará un jar con nombre alfresco-Ejercicio1.jar.
De ahora en adelante la idea irá en esta línea.


Fuentes: