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.

miércoles, 20 de agosto de 2008

Flex SDK 3.1 y Flex Builder 3.01 liberados

Me ha resultado extraño que en la página principal del site referencia http://opensource.adobe.com, en su sección de novedades, no aparezca la noticia.

Solo te das cuenta de la actualización si "pinchas" en el primer logotipo Flex SDK y observas la versión que recomiendan descargar para desarrollos en producción.

Tampoco me ha resultado sencillo encontrar la relación de cambios que incorporan estos dos nuevos productos.

Un pequeño sumario:

Flex SDK 3.1
  • Se ha dado solución a numerosos bugs, que la comunidad de usuarios ha ido aportando durante este tiempo. La lista completa de los bugs resueltos la podéis encontrar aquí.

  • Soporte para Flash Player 10, actualmente en beta y, además, no se espera el soporte definitivo hasta versiones posteriores.

  • Soporte definitivo para AIR 1.1
Flex Builder 3.0.1
  • Se ha dado solución a numerosos bugs del IDE, que la comunidad de usuarios ha ido aportando durante este tiempo. La lista completa de los bugs resueltos la podéis encontrar aquí y la de los componentes aquí.

  • Soporte para AIR 1.1

  • Soporte para Eclipse 3.4

jueves, 14 de agosto de 2008

Flex 3 y el premio Open Source 2008

Me complace mucho anunciar que, Flex 3 ha ganado el premio a la mejor herramienta Open Source 2008 para desarrolladores, en la categoría "Rich Internet Applications".

Los competidores de Flex han sido OpenLazlo -y de cerca- Curl y Silverlight (aunque estas dos últimas no sean realmente tecnologías puramente Open Source).

Si quieres ver la noticia completa o ver la relación de ganadores de otras categorías... sigue los enlaces.

lunes, 11 de agosto de 2008

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

Pasos para crear el fichero de distribución del core del framework Java:
  1. Añadiremos al proyecto "wika2-jframework" un nuevo fichero (ya deberíamos saber cómo) de nombre "build.properties", con la siguientes 5 líneas (es más fácil trabajar directamente en modo texto, que seleccionaremos con la segunda lengüeta bajo la zona de edición):
    # Propiedades del proyecto
    company.name=Wika2.org
    project.name=wika2-jframework
    project.version=1.0.0
    project.copytos=mocky
    Las tres primeras propiedades, se entienden fácilmente, son: la primera es el nombre de la empresa -se utiliza en la creación del fichero "MANIFEST.MF"- y las dos siguientes se utilizan para crear el nombre del fichero ".jar" con la distribución de este proyecto. La última propiedad es una lista (separada por ",") de los proyectos Java donde utilizaremos este ".jar" creado.
  2. Añadiremos al mismo proyecto un nuevo fichero de nombre "build.xml" con el siguiente contenido:
    <?xml version="1.0"?>

    <project name="wika2-jframework" default="dist" basedir=".">

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

    <!-- Propiedades globales para este build -->
    <property environment="env"/>
    <property name="build.dir" value="bin"/>
    <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>
    </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">
    <delete includeemptydirs="yes" failonerror="false">
    <fileset dir="${dist.dir}" includes="**/*"/>
    </delete>
    <mkdir dir="${dist.dir}"/>
    <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 el fichero de distribucion -->
    <copy file="${dist.dir}/${project.name}-${project.version}.jar" todir="../dist"/>
    <!-- Copiar a los proyectos que me utilizan -->
    <foreach list="${project.copytos}" param="project.copyto" target="update.webinflib"/>
    </target>

    <!-- Tareas auxilares para el mantenimiento correcto del proyecto -->
    <target name="update.webinflib">
    <if>
    <available file="../${project.copyto}/WebContent/WEB-INF/lib/${project.name}-*.jar"/>
    <then>
    <delete>
    <fileset dir="../${project.copyto}/WebContent/WEB-INF/lib" includes="${project.name}-*.jar"/>
    </delete>
    </then>
    </if>
    <copy file="${dist.dir}/${project.name}-${project.version}.jar" todir="../${project.copyto}/WebContent/WEB-INF/lib"/>
    </target>

    </project>
    Como podéis observar, estoy utilizando Apache Ant para la construcción de mis proyectos. He preferido utilizar Apache Ant, en lugar de Apache Maven, que parecería más lógico, ya que esto supondría añadir complejidad al proyecto. Además, personalmente, no me gusta demasiado la gestión de dependencias de Apache Maven.
  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.jar" 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\jframework\build.xml
    compile:
    [javac] Compiling 1 source file to C:\Desarrollo\Mocky\jframework\bin
    dist:
    [jar] Building jar: C:\Desarrollo\Mocky\jframework\dist\wika2-jframework-1.0.0.jar
    [copy] Copying 1 file to C:\Desarrollo\Mocky\3rdparty\lib
    [copy] Copying 1 file to C:\Desarrollo\Mocky\dist
    update.webinflib:
    [copy] Copying 1 file to C:\Desarrollo\Mocky\mocky\WebContent\WEB-INF\lib
    BUILD SUCCESSFUL
    Total time: 1 second
  6. Ahora, podemos refrescar el proyecto "wika2-jframework" y el proyecto "mocky", para ver cómo han quedado.
  7. Como podéis observar, además de compilar el proyecto y de copiarlo a la carpeta de distribución del mismo... lo ha copiado a la carpeta de librerías "WEB-INF/lib" del proyecto "mocky".
Pasos para crear el fichero de distribución del core del framework Flex:
  1. Añadiremos al proyecto "wika2-fframework" un nuevo fichero de nombre "build.properties", con la siguientes 5 líneas:
    # Propiedades del proyecto
    company.name=Wika2.org
    project.name=wika2-fframework
    project.version=1.0.0
    project.copytos=flex-mocky
    Las tres primeras propiedades, se entienden fácilmente, son: la primera es el nombre de la empresa -no se utiliza de momento- y las dos siguientes se utilizan para crear el nombre del fichero ".swc" con la distribución de este proyecto. La última propiedad es una lista (separada por ",") de los proyectos Flex donde utilizaremos este ".swc" creado.
  2. Añadiremos al mismo proyecto un nuevo fichero de nombre "build.xml" con el siguiente contenido:
    <?xml version="1.0"?>

    <project name="wika2-fframework" 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="dist"/>
    <property name="doc.dir" value="asdoc"/>
    <property name="src.dir" value="src"/>

    <!-- 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="-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">
    <delete includeemptydirs="yes" failonerror="false">
    <fileset dir="${dist.dir}" includes="**/*"/>
    </delete>
    <mkdir dir="${dist.dir}"/>
    <!-- Descubriendo clases -->
    <fileset id="sources" dir="${src.dir}/org">
    <include name="**/*.as"/>
    </fileset>
    <pathconvert property="classes" pathsep=" " refid="sources">
    <chainedmapper>
    <globmapper from="${basedir}${file.separator}${src.dir}${file.separator}*" to="*"/>
    <mapper type="package" from="*.as" to="*"/>
    </chainedmapper>
    </pathconvert>
    <!-- Crear el swc -->
    <compc output="${dist.dir}/${project.name}-${project.version}.swc" include-classes="${classes}" locale="es_ES" optimize="true" debug="false">
    <source-path path-element="${basedir}/${src.dir}"/>
    </compc>
    <!-- Copiar el fichero de distribucion al proyecto de 3rdparty -->
    <if>
    <available file="../3rdparty/lib/${project.name}-*.swc"/>
    <then>
    <delete failonerror="false">
    <fileset dir="../3rdparty/lib" includes="${project.name}-*.swc"/>
    </delete>
    </then>
    </if>
    <copy file="${dist.dir}/${project.name}-${project.version}.swc" todir="../3rdparty/lib"/>
    <!-- Copiar a los proyectos que me utilizan -->
    <foreach list="${project.copytos}" param="project.copyto" target="update.libs"/>
    </target>

    <!-- Tareas auxilares para el mantenimiento correcto del proyecto -->
    <target name="update.libs">
    <if>
    <available file="../${project.copyto}/libs/${project.name}-*.swc"/>
    <then>
    <delete>
    <fileset dir="../${project.copyto}/libs" includes="${project.name}-*.swc"/>
    </delete>
    </then>
    </if>
    <copy file="${dist.dir}/${project.name}-${project.version}.swc" todir="../${project.copyto}/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.swc" 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\fframework\build.xml
    dist:
    [mkdir] Created dir: C:\Desarrollo\Mocky\fframework\dist
    [compc] Loading configuration file C:\Desarrollo\Mocky\flex_sdk_3.0.0.477_mpl\frameworks\flex-config.xml
    [compc] C:\Desarrollo\Mocky\fframework\dist\wika2-fframework-1.0.0.swc (1178 bytes)
    [copy] Copying 1 file to C:\Desarrollo\Mocky\3rdparty\lib
    update.libs:
    [copy] Copying 1 file to C:\Desarrollo\Mocky\flex-mocky\libs
    BUILD SUCCESSFUL
    Total time: 3 seconds
  6. Ahora, podemos refrescar el proyecto "wika2-fframework" y el proyecto "flex-mocky", para ver cómo han quedado.
  7. Como podéis observar, además de compilar el proyecto y de copiarlo a la carpeta de distribución del mismo... lo ha copiado a la carpeta de librerías "libs" del proyecto "flex-mocky".

viernes, 8 de agosto de 2008

Blogger me ha duplicado entradas

Blogger me ha duplicado, estos últimos días, dos entradas. Son las siguientes:
  • Desarrollando con Flex, flexmdi, PureMVC, BlazeDS, Spring, JPA, Hibernate,... (parte 5)
  • Desarrollando con Flex, flexmdi, PureMVC, BlazeDS, Spring, JPA, Hibernate,... (parte 4)
Puede dar la falsa sensación de que he escrito más artículos de los que realmente he publicado ;-)

Además Blogger no me deja borrarlas. Realmente sí me deja borrarlas, pero las deja en un estado peor de lo que están ahora.

Las dos entradas tienen la misma URL, con el mismo blogID.

He descubierto que esto mismo les ha pasado a más bloggers por estas fechas, así que espero que pronto nos den una solución -automáticamente- al problema.

ACTUALIZACIÓN (11 de agosto): como veis, el problema de las entradas duplicadas ha sido resuelto, en pocas horas.

miércoles, 6 de agosto de 2008

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

Pasos a seguir para construir el cuarto proyecto mocky:

  1. Seleccionaremos el menú "File-New-Dynamic Web Project...".
  2. En la siguiente ventana, como nombre de proyecto (campo "Project name") utilizaré "mocky". Desmarcaremos el checkbox "Use default" y en el campo "Directory" introduciremos el valor "C:\Desarrollo\Mocky\mocky". El resto de los campos los dejaremos "tal cual" y pulsaremos el botón "Next".
  3. En la siguiente ventana, dejaremos todo "tal cual" y terminaremos la creación del proyecto pulsando el botón "Finish".
  4. Ahora tenemos que copiar (lo podemos hacer desde el propio entorno de desarrollo o desde el sistema operativo) todos los ficheros ".jar" que hay en "C:\Desarrollo\Mocky\3rdparty\wika2" al directorio "C:\Desarrollo\Mocky\mocky\WebContent\WEB-INF\lib". Refrescaremos el contenido, desde el entorno de desarrollo, pinchando con el botón derecho del ratón sobre el proyecto "mocky" y seleccionando "Refresh".
  5. Crearemos nuestra primera clase Java, pinchando con el botón derecho del ratón sobre la carpeta de fuentes "src" y seleccionando "New-Class".
  6. En la siguiente ventana, en el campo "Package" introduciremos el valor "org.wika2.mocky.util" y en el nombre de la clase (campo "Name") vamos a poner "DummyUtils". El resto de los campos los dejaremos "tal cual" y pulsaremos el botón "Finish".

Pasos a seguir para construir el quinto (y último) proyecto flex-mocky:

  1. Seleccionaremos el menú "File-New-Project...", pincharemos en la rama "General-Project" y pulsaremos el botón "Next".
  2. En la siguiente ventana, como nombre de proyecto (campo "Project name") utilizaré "flex-mocky". Desmarcaremos el checkbox "Use default location" y en el campo "Location" introduciremos el valor "C:\Desarrollo\Mocky\flex-mocky". El resto de los campos los dejaremos "tal cual" y pulsaremos el botón "Finish".
  3. Crearemos una nueva clase ActionScript, pinchando con el botón derecho del ratón sobre la carpeta del proyecto "flex-mocky" y seleccionando "New-Folder".
  4. En la siguiente ventana, en el campo "Folder name" introduciremos el valor "src/org/wika2/mocky/util" y pulsaremos el botón "Finish".
  5. Pinchando con el botón derecho del ratón sobre la carpeta recién creada "util" y seleccionando "New-File", crearemos nuestra nueva clase ActionScript.
  6. En la siguiente ventana, en el campo "File name" introduciremos el valor "DummyUtils.as" y pulsaremos el botón "Finish".

Se nos abrirá el editor de textos, donde pegaremos el siguiente código ActionScript:


package org.wika2.mocky.util {

public class DummyUtils {
}

}
  1. Antes de crear nuestro primer fichero Flex, tenemos que asociar la extensión ".mxml" al editor de XML por defecto de Eclipse. Seleccionaremos el menú "Windows-Preferences" y la rama "General-Editors-File Associations". Añadiremos (con el botón "Add.." de la zona superior) un nuevo tipo de fichero "*.mxml" y lo asociaremos (con el botón "Add..." de la zona inferior) al editor "XML Editor" de la lista que se nos presenta.
  2. También, tenemos que asociar el tipo de contenido correspondiente. En esta misma ventana, en la rama "General-Content Types", desplegaremos el árbol con los "Content types" y seleccionaremos el "Text-XML (Illformed)". Una vez seleccionado, añadiremos (con el botón "Add..." de la zona inferior) el nuevo tipo de contenido "*.mxml" a la lista.
  3. Saldremos de la ventana de preferencias pulsando el botón "Ok".
  4. Pinchando con el botón derecho del ratón sobre la carpeta recién creada "src" y seleccionando "New-File", crearemos nuestro primer fichero Flex.
  5. En la siguiente ventana, en el campo "File name" introduciremos el valor "Mocky.mxml" y pulsaremos el botón "Finish".

Se nos abrirá el editor de textos, es más cómodo para trabajar seleccionar el modo "Source" de entre las dos lengüetas que hay bajo la zona del editor, donde pegaremos el siguiente código Flex:


<?xml version="1.0" encoding="utf-8"?>

<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%" height="100%" layout="absolute"
minWidth="760" minHeight="460"
pageTitle="Mocky">

</mx:Application>

Ahora, debemos tener algo similar a lo que aparece en la siguiente figura:

flex-parte6-fig1.png

martes, 5 de agosto de 2008

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

Ya es hora de ponernos "manos a la obra" con nuestro proyecto Mocky. Voy a empezar creando cinco (sí habéis leído bien) proyectos Eclipse:
  1. 3rdparty: es un proyecto que solamente contiene APIs Java, librerías ".jar", que suelo utilizar en TODOS mis proyectos. Luego lo añadiré al "Java Build Path" de todos los proyectos Java de mi organización.
  2. jframework: es un proyecto que contiene clases Java (la primera "j" es de java) de lo que será el core de mi framework, común a todos los proyectos construidos por mi organización.
  3. fframework: es un proyecto que contiene clases ActionScript (la primera "f" es de flex) de lo que será el core de mi framework, común a todos los proyectos construidos por mi organización.
  4. mocky: es el proyecto que tiene la parte que "corre" del lado del servidor (J2EE).
  5. flex-mocky: es el proyecto que tiene la parte que "corre" del lado del cliente (Flex).
Pasos a seguir para construir el primer proyecto 3rdparty:
  1. Descargaremos el siguiente zip, que ya he dejado preparado con el proyecto completo. Contiene un conjunto de APIs que, personalmente, he ido seleccionando a lo largo del tiempo y que cubre un espectro bastante amplio de necesidades.
  2. "Deszipearemos" el contenido dentro de la carpeta "C:\Desarrollo\Mocky\3rdparty".
  3. Lo importaremos en nuestro entorno de desarrollo Eclipse. Seleccionaremos el menú "File-Import..." y pincharemos la rama "General-Existing Projects into Workspace".
  4. En la siguiente ventana, rellenaremos el campo "Select root directory" con el directorio donde hemos "deszipeado" el fichero descargado "C:\Desarrollo\Mocky\3rdparty" y pulsaremos el botón "Finish".
  5. Ahora ya tenemos que ver, en el "Project Explorer" de la parte izquierda de nuestro Eclipse, nuestro primer proyecto "wika2-3rdparty", importado y sin errores.
NOTA: wika2 es el término que voy a utilizar como nombre para mi organización ;-) Podéis sustituirlo por el nombre de vuestra organización, si queréis.

Pasos a seguir para construir el segundo proyecto jframework:
  1. Seleccionaremos el menú "File-New-Project...", pincharemos en la rama "Java-Java Project" y pulsaremos el botón "Next".
  2. En la siguiente ventana, como nombre de proyecto (campo "Project name") utilizaré "wika2-jframework". Seleccionaremos "Create project from existing source" y en el campo "Directory" introduciremos el valor "C:\Desarrollo\Mocky\jframework". El resto de los campos los dejaremos "tal cual" y pulsaremos el botón "Next".
  3. En la siguiente ventana, pincharemos en la lengüeta "Projects" (la segunda, tras "Source") y pulsaremos el botón "Add...". Seleccionaremos el proyecto anteriormente creado "wika2-3rdparty" y pulsaremos el botón "Ok".
  4. Finalmente, terminaremos la creación del proyecto pulsando el botón "Finish".
  5. Nos preguntarán si queremos asociar el proyecto a la perspectiva "Java"... yo respondo que "No" y que, además, recuerde mi decisión (trabajaremos siempre desde la perspectiva "Java EE").
  6. Crearemos nuestra primera clase Java, pinchando con el botón derecho del ratón sobre la carpeta de fuentes "src" y seleccionando "New-Class".
  7. En la siguiente ventana, en el campo "Package" introduciremos el valor "org.wika2.jframework.util" y en el nombre de la clase (campo "Name") vamos a poner "DummyUtils". El resto de los campos los dejaremos "tal cual" y pulsaremos el botón "Finish".
Pasos a seguir para construir el tercer proyecto fframework:
  1. Seleccionaremos el menú "File-New-Project...", pincharemos en la rama "General-Project" y pulsaremos el botón "Next".
  2. En la siguiente ventana, como nombre de proyecto (campo "Project name") utilizaré "wika2-fframework". Desmarcaremos el checkbox "Use default location" y en el campo "Location" introduciremos el valor "C:\Desarrollo\Mocky\fframework". El resto de los campos los dejaremos "tal cual" y pulsaremos el botón "Finish".
  3. Crearemos nuestra primera clase ActionScript, pinchando con el botón derecho del ratón sobre la carpeta del proyecto "wika2-fframework" y seleccionando "New-Folder".
  4. En la siguiente ventana, en el campo "Folder name" introduciremos el valor "src/org/wika2/fframework/util" y pulsaremos el botón "Finish".
  5. Antes de crear nuestra clase ActionScript, tenemos que asociar la extensión ".as" al editor de textos por defecto de Eclipse. Seleccionaremos el menú "Windows-Preferences" y la rama "General-Editors-File Associations". Añadiremos (con el botón "Add.." de la zona superior) un nuevo tipo de fichero "*.as" y lo asociaremos (con el botón "Add..." de la zona inferior) al editor "Text Editor" de la lista que se nos presenta. Saldremos de la ventana de preferencias pulsando el botón "Ok".
  6. Pinchando con el botón derecho del ratón sobre la carpeta recién creada "util" y seleccionando "New-File", crearemos nuestra primera clase ActionScript.
  7. En la siguiente ventana, en el campo "File name" introduciremos el valor "DummyUtils.as" y pulsaremos el botón "Finish".
  8. Se nos abrirá el editor de textos, donde pegaremos el siguiente código ActionScript:

package org.wika2.fframework.util {

public class DummyUtils {
}

}
Por ahora, eso es todo. En un próximo artículo continuaré con la creación de los dos proyectos que nos faltan y con la creación de los "build.xml", asociados a cada proyecto, necesarios para poder crear la distribución de nuestra aplicación.

lunes, 4 de agosto de 2008

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

Mi proyecto ejemplo se llamará "Mocky". Será el "esqueleto" de una sencilla aplicación que, simplemente, pedirá al usuario que se identifique y le permitirá mantener la información de un par de tablas, de una base de datos, mediante unos sencillos formularios.

Voy a explicar como preparar el entorno de desarrollo:
  1. Crearemos una carpeta, llamada mocky, en nuestro sistema de ficheros. Contendrá todo nuestro proyecto, tanto el entorno de desarrollo como el proyecto en sí mismo. Para los usuarios Linux podría ser "/opt/desarrollo/mocky" y para los usuarios Windows "C:\Desarrollo\Mocky". Os recomiendo no utilizar espacios en blanco para nombrar carpetas, cuando trabajemos con este tipo de desarrollos.
  2. Instalaremos el IDE Eclipse en esta carpeta. Yo he instalado la última versión del paquete "Eclipse IDE for Java EE Developers (Ganymede)" disponible a la fecha del artículo. La instalación es tan sencilla como "deszipear" el fichero descargado.
  3. Instalaremos el contenedor de servlets Tomcat en esta carpeta. Yo he instalado la versión 5.5.26, porque es con la que suelo trabajar, pero serviría cualquier versión superior. La instalación es tan sencilla como "deszipear" el fichero descargado.
  4. Instalaremos la base de datos MySQL en esta carpeta. Yo he instalado la última versión estable y disponible a la fecha del artículo.
  5. Instalaremos el SDK de Flex en esta carpeta. Yo he instalado la última versión del Open Source Flex SDK estable y disponible a la fecha del artículo. La instalación es tan sencilla como "deszipear" el fichero descargado. Instalaremos, también, la localización en Español, tal y como conté en un artículo anterior.
  6. Instalaremos el SDK de Java en esta carpeta. Yo he instalado la versión JVM 5.0 Update 16, porque es con la que suelo trabajar, pero serviría cualquier versión superior.
  7. Ahora, en nuestra carpeta, deberíamos tener "algo" como lo siguiente:

  1. Crearemos 3 variables de entorno:
  • JAVA_HOME apuntando a "C:\Desarrollo\Mocky\jdk1.5.0_16"
  • FLEX_HOME apuntando a "C:\Desarrollo\Mocky\flex_sdk_3.0.0.477_mpl"
  • MOCKY_HOME apuntando a "C:\Desarrollo\Mocky"
  • y añadiremos al PATH el directorio de binarios de nuestra JVM "%JAVA_HOME%/bin"
  1. Ejecutaremos el entorno de desarrollo con "C:\Desarrollo\Mocky\eclipse\eclipse.exe". Al lanzarlo por primera vez, nos solicitará un directorio para guardar nuestro espacio de trabajo. Le indicaremos el siguiente "C:\Desarrollo\Mocky\eclipse\workspace" y marcaremos el "checkbox" para que no nos pregunte más en el futuro.
  2. Cerraremos la primera pantalla de bienvenida o "Welcome" y nos aparecerá la perspectiva por defecto "Java EE".
  3. Comprobaremos que el entorno ha encontrado nuestra JVM recién instalada. Desde el menú "Windows-Preferences" seleccionaremos la rama "Java-Installed JRE" y comprobamos.
  4. Vamos a crear un nuevo servidor en el IDE asociado a nuestra instalación de Tomcat. Desde el menú "Windows-Preferences" seleccionaremos la rama "Server-Runtime Environments". Pulsaremos el botón "Add...", seleccionaremos la rama "Apache-Apache Tomcat 5.5", marcaremos "Create a new local server" y pulsaremos el botón "Next". En la siguiente pantalla, pulsaremos el botón "Browse...", localizaremos el directorio "C:\Desarrollo\Mocky\apache-tomcat-5.5.26", comprobaremos que el JRE asignado es "Workbench default JRE" y terminaremos pulsando "Finish".
  5. Ahora tendremos, en nuestra perspectiva "Java J2EE", un nuevo proyecto denominado "Servers" (que no debemos borrar NUNCA) y en las vistas, en la parte inferior del entorno de desarrollo, una lengüeta "Servers" con nuestra instalación de Tomcat. Comprobaremos que, con los botones de "Start" y "Stop" o con el botón derecho del ratón sobre el servidor, podemos arrancar y parar sin errores.
  6. Ya tenemos nuestro entorno de desarrollo preparado para empezar a crear NUESTROS proyectos.