martes, 26 de agosto de 2008

Desarrollando con Flex, flexmdi, PureMVC, BlazeDS, Spring, JPA, Hibernate,... (parte 8)

Pasos para crear el fichero de distribución swf, la parte Flex del proyecto Mocky:
  1. Añadiremos al proyecto "flex-mocky" un nuevo fichero de nombre "build.properties", con la siguientes 8 líneas:
    # Propiedades del proyecto
    company.name=Wika2.org
    project.name=flex-mocky
    project.version=1.0.0
    project.refs=wika2-fframework-1.0.0
    project.mxml=Mocky
    project.blazeds.service.config=mocky
    project.blazeds.context.root=mocky
    Las tres primeras propiedades, se entienden fácilmente, son: la primera es el nombre de la empresa -se utiliza para rellenar la metainformación del swf que vamos a generar- y las dos siguientes se utilizan para crear el nombre del fichero ".swf" con la distribución de este proyecto. La propiedad project-refs es una lista (separada por ",") de las librerías "swc" que forman parte de este ".swf" creado, se copiarán en la carpeta "libs" del proyecto antes de compilarse. La propiedad project.mxml indica el nombre del fichero ".mxml" principal de la aplicación. Las dos siguientes propiedades, relacionadas con BlazeDS, las utilizaremos más adelante.
  2. Añadiremos al mismo proyecto un nuevo fichero de nombre "build.xml" con el siguiente contenido:
    <?xml version="1.0"?>

    <project name="flex-mocky" default="dist" basedir=".">

    <!-- Lectura de propiedades externas -->
    <property file="build.properties"/>

    <!-- Propiedades globales para este build -->
    <property environment="env"/>
    <property name="FLEX_HOME" value="${env.FLEX_HOME}"/>
    <property name="dist.dir" value="bin-release"/>
    <property name="doc.dir" value="asdoc"/>
    <property name="src.dir" value="src"/>
    <property name="html.template.dir" value="html-template"/>

    <!-- Declaracion del classpath -->
    <path id="project.classpath">
    <fileset dir="../3rdparty/ant">
    <include name="**/*.jar"/>
    <include name="**/*.zip"/>
    </fileset>
    <fileset dir="../3rdparty/lib">
    <include name="**/*.jar"/>
    <include name="**/*.zip"/>
    </fileset>
    </path>

    <!-- Tareas -->
    <taskdef resource="net/sf/antcontrib/antcontrib.properties"
    classpathref="project.classpath"/>

    <taskdef resource="flexTasks.tasks"
    classpathref="project.classpath"/>

    <!-- Limpieza -->
    <target name="clean">
    <delete dir="${dist.dir}"/>
    <delete dir="${doc.dir}"/>
    </target>

    <!-- Generar la documentacion -->
    <target name="asdoc">
    <delete includeemptydirs="yes" failonerror="false">
    <fileset dir="${doc.dir}" includes="**/*"/>
    </delete>
    <mkdir dir="${doc.dir}"/>
    <exec executable="${env.FLEX_HOME}\bin\asdoc.exe" failonerror="true">
    <arg line="-doc-sources ${src.dir}/com"/>
    <arg line="-external-library-path 'libs'"/>
    <arg line="-main-title '${project.name} API Documentation'"/>
    <arg line="-output ${doc.dir}"/>
    <arg line="-source-path ${src.dir}"/>
    <arg line="-window-title '${project.name}'"/>
    </exec>
    </target>

    <!-- Generar los Flex de la aplicacion -->
    <target name="dist">
    <!-- Copiar los proyectos referenciados -->
    <foreach list="${project.refs}" param="project.ref" target="update.lib"/>
    <!-- Crear el swf -->
    <mxmlc file="${basedir}/${src.dir}/${project.mxml}.mxml"
    debug="false"
    locale="es_ES"
    optimize="true"
    output="${dist.dir}/${project.mxml}.swf">
    <load-config filename="${env.FLEX_HOME}/frameworks/flex-config.xml"/>
    <source-path path-element="${env.FLEX_HOME}/frameworks"/>
    <compiler.source-path path-element="${basedir}/${src.dir}"/>
    <compiler.library-path dir="libs" append="true">
    <include name="*.swc"/>
    </compiler.library-path>
    <metadata description="FLEX ${project.name}">
    <contributor name="${company.name}"/>
    </metadata>
    </mxmlc>
    <!-- Generar la carpeta con la plantilla html -->
    <html-wrapper title="${project.mxml}"
    application="${project.mxml}"
    bgcolor="#869ca7"
    height="100%"
    history="true"
    output="${dist.dir}"
    swf="${project.mxml}"
    template="express-installation"
    version-major="9"
    version-minor="0"
    version-revision="28"
    width="100%"/>
    </target>

    <!-- Tareas auxilares para el mantenimiento correcto del proyecto -->
    <target name="update.lib">
    <copy file="../3rdparty/lib/${project.ref}.swc" todir="libs"/>
    </target>

    </project>
  3. Tengo 3 targets definidos en este fichero de construcción: clean, asdoc y dist. Utilizaremos "dist" que, además de compilar, nos creará un fichero "project.name-project.version.swf" en una nueva carpeta "bin-release" que aparecerá dentro en la carpeta del proyecto.
  4. Pincharemos con el botón derecho del ratón sobre el "build.xml", en el "Project Explorer" de nuestro Eclipse, y seleccionaremos el menú "Rus As-Ant Build" y comenzará el proceso de creación del fichero de distribución, que podremos seguir en la "Console". El target "dist" está definido como target por defecto ;-) en el fichero de contrucción.
  5. Deberíamos obtener "algo" como lo siguiente:
    Buildfile: C:\Desarrollo\Mocky\flex-mocky\build.xml
    dist:
    update.lib:
    [mxmlc] Loading configuration file C:\Desarrollo\Mocky\flex_sdk_3.0.0.477_mpl\frameworks\flex-config.xml
    [mxmlc] C:\Desarrollo\Mocky\flex-mocky\bin-release\Mocky.swf (150640 bytes)
    BUILD SUCCESSFUL
    Total time: 13 seconds
  6. Ahora, podemos refrescar el proyecto el proyecto "flex-mocky", para ver cómo ha quedado.
  7. Como podéis observar, además de compilar el proyecto, lo ha copiado a la carpeta de distribución "bin-release" del proyecto "flex-mocky".
Pasos para crear el fichero de distribución war, del proyecto Mocky, listo para desplegarse en nuestro servidor de aplicaciones:
  1. Añadiremos al proyecto "mocky" un nuevo fichero de nombre "build.properties", con la siguientes 6 líneas:
    # Propiedades del proyecto
    company.name=Wika2.org
    project.name=mocky
    project.version=1.0.0
    project.refs=wika2-jframework-1.0.0
    project.flex.folder=../flex-mocky
    Las tres primeras propiedades, se entienden fácilmente, son: la primera es el nombre de la empresa -se utiliza en la creación de los ficheros "MANIFEST.MF"- y las dos siguientes se utilizan para crear el nombre del fichero ".war" con la distribución de este proyecto. La propiedad project-refs es una lista (separada por ",") de las librerías "jar" que forman parte de este ".war" creado, se copiarán en la carpeta "WEBINF/lib" del proyecto antes de compilarse. La propiedad project.flex.folder indica el path, relativo al proyecto actual, al directorio del proyecto que tiene la parte Flex de la aplicación.
  2. Añadiremos al mismo proyecto un nuevo fichero de nombre "build.xml" con el siguiente contenido:
    <?xml version="1.0"?>

    <project name="mocky" default="dist" basedir=".">

    <!-- Lectura de propiedades externas -->
    <property file="build.properties"/>

    <!-- Propiedades globales para este build -->
    <property environment="env"/>
    <property name="build.dir" value="build/classes"/>
    <property name="dist.dir" value="dist"/>
    <property name="doc.dir" value="javadoc"/>
    <property name="src.dir" value="src"/>

    <!-- Condiciones -->
    <condition property="3rdparty.available">
    <available file="../3rdparty/lib/${project.name}-${project.version}.jar"/>
    </condition>

    <!-- Declaracion del classpath -->
    <path id="project.classpath">
    <fileset dir="../3rdparty/ant">
    <include name="**/*.jar"/>
    <include name="**/*.zip"/>
    </fileset>
    <fileset dir="../3rdparty/lib">
    <include name="**/*.jar"/>
    <include name="**/*.zip"/>
    </fileset>
    <fileset dir="WebContent/WEB-INF/lib">
    <include name="**/*.jar"/>
    <include name="**/*.zip"/>
    </fileset>
    </path>

    <!-- Enlaces utiles -->
    <patternset id="meta.files">
    <include name="**/*.dtd"/>
    <include name="**/*.properties"/>
    <include name="**/*.xml"/>
    </patternset>

    <!-- Tareas -->
    <taskdef resource="net/sf/antcontrib/antcontrib.properties"
    classpathref="project.classpath"/>

    <!-- Limpieza -->
    <target name="clean">
    <delete dir="${build.dir}"/>
    <delete dir="${dist.dir}"/>
    <delete dir="${doc.dir}"/>
    </target>

    <!-- Compilar los fuentes Java -->
    <target name="compile">
    <delete includeemptydirs="yes" failonerror="false">
    <fileset dir="${build.dir}" includes="**/*"/>
    </delete>
    <mkdir dir="${build.dir}"/>
    <javac srcdir="${src.dir}" destdir="${build.dir}" nowarn="on">
    <classpath refid="project.classpath"/>
    </javac>
    <!-- Copiar los metadatos al classpath de este build -->
    <copy todir="${build.dir}">
    <fileset dir="${src.dir}">
    <patternset refid="meta.files"/>
    </fileset>
    </copy>
    </target>

    <!-- Generar la documentacion -->
    <target name="javadoc">
    <delete includeemptydirs="yes" failonerror="false">
    <fileset dir="${doc.dir}" includes="**/*"/>
    </delete>
    <mkdir dir="${doc.dir}"/>
    <javadoc destdir="${doc.dir}" >
    <classpath refid="project.classpath"/>
    <fileset dir="${src.dir}">
    <include name="**/*.java"/>
    </fileset>
    </javadoc>
    </target>

    <!-- Generar el fichero de distribucion -->
    <target name="dist" depends="compile">
    <!-- Borra los ficheros de distribucion antiguos -->
    <delete includeemptydirs="yes" failonerror="false">
    <fileset dir="${dist.dir}" includes="**/*"/>
    </delete>
    <mkdir dir="${dist.dir}"/>
    <!-- Empaqueta en un jar los fuentes compilados del proyecto -->
    <jar destfile="${dist.dir}/${project.name}-${project.version}.jar" basedir="${build.dir}">
    <manifest>
    <attribute name="Built-By" value="${company.name}"/>
    <attribute name="Implementation-Title" value="${project.name}"/>
    <attribute name="Implementation-Version" value="${project.version}"/>
    </manifest>
    </jar>
    <!-- Copiar el fichero de distribucion al proyecto de 3rdparty -->
    <if>
    <available file="../3rdparty/lib/${project.name}-*.jar"/>
    <then>
    <delete>
    <fileset dir="../3rdparty/lib" includes="${project.name}-*.jar"/>
    </delete>
    </then>
    </if>
    <copy file="${dist.dir}/${project.name}-${project.version}.jar" todir="../3rdparty/lib"/>
    <!-- Copiar la carpeta del proyecto flex -->
    <copy todir="WebContent">
    <fileset dir="${project.flex.folder}/bin-release">
    <include name="**/*"/>
    </fileset>
    </copy>
    <delete dir="WebContent/assets"/>
    <if>
    <available file="${project.flex.folder}/src/assets" type="dir"/>
    <then>
    <copy todir="WebContent/assets">
    <fileset dir="${project.flex.folder}/src/assets">
    <include name="**/*"/>
    <exclude name="**/*.xml"/>
    </fileset>
    </copy>
    <copy todir="WebContent/assets">
    <fileset dir="${project.flex.folder}/src/assets">
    <include name="**/*.xml"/>
    </fileset>
    <filterset>
    <filter token="development" value="false"/>
    </filterset>
    </copy>
    </then>
    </if>
    <!-- Copiar los proyectos referenciados -->
    <foreach list="${project.refs}" param="project.ref" target="update.webinflib"/>
    <!-- Crear el war -->
    <war destfile="${dist.dir}/${project.name}-${project.version}.war" webxml="WebContent/WEB-INF/web.xml">
    <manifest>
    <attribute name="Built-By" value="${company.name}"/>
    <attribute name="Implementation-Title" value="${project.name}"/>
    <attribute name="Implementation-Version" value="${project.version}"/>
    </manifest>
    <fileset dir="WebContent">
    <exclude name="**/.*"/>
    <exclude name="META-INF/*.xml"/>
    <exclude name="WEB-INF/web.xml"/>
    </fileset>
    <lib dir="${dist.dir}">
    <include name="${project.name}-${project.version}.jar"/>
    </lib>
    </war>
    <!-- Copiar el fichero de distribucion -->
    <copy file="${dist.dir}/${project.name}-${project.version}.war" todir="../dist"/>
    </target>

    <!-- Tareas auxilares para el mantenimiento correcto del proyecto -->
    <target name="update.webinflib">
    <copy file="../3rdparty/lib/${project.ref}.jar" todir="WebContent/WEB-INF/lib"/>
    </target>

    </project>
  3. Tengo 4 targets definidos en este fichero de construcción: clean, compile, javadoc y dist. Utilizaremos "dist" que, además de compilar, nos creará un fichero "project.name-project.version.war" en una nueva carpeta "dist" que aparecerá dentro en la carpeta del proyecto.
  4. Pincharemos con el botón derecho del ratón sobre el "build.xml", en el "Project Explorer" de nuestro Eclipse, y seleccionaremos el menú "Rus As-Ant Build" y comenzará el proceso de creación del fichero de distribución, que podremos seguir en la "Console". El target "dist" está definido como target por defecto ;-) en el fichero de contrucción.
  5. Deberíamos obtener "algo" como lo siguiente:
    Buildfile: C:\Desarrollo\Mocky\mocky\build.xml
    compile:
    [javac] Compiling 1 source file to C:\Desarrollo\Mocky\mocky\build\classes
    dist:
    [jar] Building jar: C:\Desarrollo\Mocky\mocky\dist\mocky-1.0.0.jar
    [copy] Copying 1 file to C:\Desarrollo\Mocky\3rdparty\lib
    update.webinflib:
    [war] Building war: C:\Desarrollo\Mocky\mocky\dist\mocky-1.0.0.war
    [copy] Copying 1 file to C:\Desarrollo\Mocky\dist
    BUILD SUCCESSFUL
    Total time: 11 seconds
  6. Ahora, podemos refrescar el proyecto el proyecto "mocky", para ver cómo ha quedado.
  7. Como podéis observar, además de compilar el proyecto, lo ha copiado a la carpeta de distribución "dist" del proyecto "mocky".
Vamos a desplegar nuestra aplicación en el servidor de aplicaciones Tomcat que integramos, hace unos artículos, en nuestro IDE y lanzaremos la aplicación, para comprobar que TODO funciona correctamente, de momento:
  1. En las vistas, en la parte inferior del entorno de desarrollo, hay una lengüeta "Servers" con nuestra instalación de Tomcat.
  2. Picharemos con el botón derecho sobre esta instalación de Tomcat y seleccionaremos el menú "Add and Remove Projects...". Añadiremos "Add..." a la lista de proyectos configurados, desde la lista de proyectos disponibles, nuestro proyecto mocky. Pulsaremos el botón "Finish" y nuestro proyecto aparecerá bajo la instalación de Tomcat.
  3. Comprobaremos que, con el botón de "Start" o con el botón derecho del ratón sobre el servidor, podemos arrancar sin errores.
  4. Abriremos un navegador y llamaremos a la url http://127.0.0.1:8080/mocky y... voilà!!!
  5. Deberíamos tener delante de nuestros ojos la fantástica -y vacía- aplicación MOCKY.

1 comentario:

annieruci dijo...

escribeme a annieruci@gmail.com para platicarte algunas dudas