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".

No hay comentarios: