Preparar proyecto web con Ant y Tomcat sin errores

Lo primero que necesitamos es bajarnos:

  • Java JDK
  • Apache Ant
  • Apache Tomcat
  • Eclipse

Lo primero que hacemos es configurar las variables de entorno en nuestro equipo:

  • Vamos a Botón derecha sobre equipo/propiedades/Configuración avanzada del sistema/Opciones avanzadas/variables de entorno
  • Añadimos:
    • ANT_HOME = (dir donde descomprimos ant)
    • JAVA_HOME = (dir donde descomprimos las jdk)
    • CATALINA_HOME = (dir donde descomprimos tomcat)
    • (añadimos al final) Path= (lo q hubiera);%JAVA_HOME%\bin;%ANT_HOME%\bin;%CATALINA_HOME%\bin

Hecho esto vamos a eclipse creamos un nuevo proyecto de web dinamico y comenzamos creando un archivo JSP muy simple llamado 'index.jsp' en el directorio 'WebContent'. El archivo 'index.jsp' es el punto de entrada a nuestra aplicacion.

'ourwebapp/WebContent/index.jsp':

<html>
  <head><title>Example Web Application</title></head>
  <body>
    <h1>Example Web Application</h1>
    <p>This is my test.</p>
  </body>
</html>

Para tener una aplicacion web completa vamos a crear dentro de la carpeta 'WEB-INF' que está dentro de 'WebContent' un archivo llamado 'web.xml'.

'ourwebapp/WebContent/WEB-INF/web.xml':

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
  <welcome-file-list>
    <welcome-file>
      index.jsp
    </welcome-file>
  </welcome-file-list>
</web-app>

 

Escribamos ahora un script para Ant el cual contendrá la información necesaria para compilar, construir y desplegar la aplicación automáticamente.

'ourwebapp/build.xml':

<?xml version="1.0"?>

<project name="ourwebapp" basedir="." default="usage">
    <property file="build.properties"/>

    <property name="src.dir" value="src"/>
    <property name="web.dir" value="war"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="name" value="ourwebapp"/>

    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <!-- We need the servlet API classes: -->
        <!--  * for Tomcat 5/6 use servlet-api.jar -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="servlet*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>

    <target name="usage">
        <echo message=""/>
        <echo message="${name} build file"/>
        <echo message="-----------------------------------"/>
        <echo message=""/>
        <echo message="Available targets are:"/>
        <echo message=""/>
        <echo message="build     --> Build the application"/>
        <echo message="deploy    --> Deploy application as directory"/>
        <echo message="deploywar --> Deploy application as a WAR file"/>
        <echo message="install   --> Install application in Tomcat"/>
        <echo message="reload    --> Reload application in Tomcat"/>
        <echo message="start     --> Start Tomcat application"/>
        <echo message="stop      --> Stop Tomcat application"/>
        <echo message="list      --> List Tomcat applications"/>
        <echo message=""/>
    </target>

    <target name="build" description="Compile main source tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.7" target="1.7" debug="true"
               deprecation="false" optimize="false" failonerror="true" includeantruntime="false">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>

    <target name="deploy" depends="build" description="Deploy application">
        <copy todir="${deploy.path}/${name}" preservelastmodified="true">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </copy>
    </target>

    <target name="deploywar" depends="build" description="Deploy application as a WAR file">
        <war destfile="${name}.war"
             webxml="${web.dir}/WEB-INF/web.xml">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </war>
        <copy todir="${deploy.path}" preservelastmodified="true">
            <fileset dir=".">
                <include name="*.war"/>
            </fileset>
        </copy>
    </target>
    
<!-- ============================================================== -->
<!-- Tomcat tasks - remove these if you don't have Tomcat installed -->
<!-- ============================================================== -->

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
            <include name="tomcat-coyote.jar"/>
            <include name="tomcat-util.jar"/>
        </fileset>
        <fileset dir="${appserver.home}/bin">
                <include name="tomcat-juli.jar"/>
        </fileset>
    </path>

    <taskdef name="install" classname="org.apache.catalina.ant.DeployTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="list" classname="org.apache.catalina.ant.ListTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="start" classname="org.apache.catalina.ant.StartTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="stop" classname="org.apache.catalina.ant.StopTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>

    <target name="install" description="Install application in Tomcat">
        <install url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"
                 war="${name}"/>
    </target>

    <target name="reload" description="Reload application in Tomcat">
        <reload url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

    <target name="start" description="Start Tomcat application">
        <start url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

    <target name="stop" description="Stop Tomcat application">
        <stop url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

    <target name="list" description="List Tomcat applications">
        <list url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"/>
    </target>

<!-- End Tomcat tasks -->
</project>

Hago incapie en lo que tengo marcado en rojo porque circulan varios ficheros como este que tienen errores, todo este artículo esta comprobado y funciona con una versión de Tomcat 1.7 y java 1.7. Si estas usando un IDE, es posible que encuentre errores en el archivo 'build.xml', como los objetivos de Tomcat. Ignoralos, el archivo listado arriba es correcto.

En este fichero se han corregido errores que dan otros como:

taskdef class org.apache.catalina.ant.InstallTask cannot be found using the classloader AntClassLoader[C:\dev\apache-tomcat-7.0.5\lib\catalina-ant.jar esto se ha corregido cambiando InstallTask por DeployTask ya que en Tomcat 7 está deprecated y se ha reemplazado por DeployTask.

java.lang.NoClassDefFoundError: org/apache/tomcat/util/buf/B2CConverter se ha corregido añadiendo:

 <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
            <include name="tomcat-coyote.jar"/>
            <include name="tomcat-util.jar"/>
        </fileset>
        <fileset dir="${appserver.home}/bin">
                <include name="tomcat-juli.jar"/>
        </fileset>
 </path>

 

Tambien necesitamos un archivo 'build.properties' que modificaremos para que coincida con nuestra instalacion del servidor. Este archivo permanecera en el mismo directorio donde hemos guardado el archivo 'build.xml'.

'springapp/build.properties':

# Ant properties for building the springapp

appserver.home=Z:/apache-tomcat-7.0.39
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib

deploy.path=${appserver.home}/webapps

tomcat.manager.url=http://localhost:8080/manager/text
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret

Otros ficheros que circulan no tienen en la url lo de text y con Tomcat 7 es necesario poner text o html para la salida, y como en nuestro caso lo usaremos por consola dejaremos text

Para crear un usuario de Tomcat llamado 'tomcat' con contraseña 's3cret', edita el archivo de usuarios de Tomcat 'appserver.home/conf/tomcat-users.xml' y añade una nueva entrada de usuario.

<tomcat-users> 
   <role rolename="manager-script"/>
   <role rolename="manager"/>  
   <user username="tomcat" password="s3cret" roles="manager-script,manager"/>
</tomcat-users>

A partir de la version 1.7 de Tomcat es necesario darle permisos a manager-script para acceder a la version de texto, porque sino obtendremos el siguiente error:

java.io.FileNotFoundException: http://localhost:8080/manager/list

Ahora ejecutaremos Ant para estar seguros que todo funciona bien. Abrimos la consola, nos situamos en el directorio 'ourwebapp' y ponemos: 'ant'

Z:\repo2\ourwebapp>ant
Buildfile: Z:\repo2\ourwebapp\build.xml

usage:
     [echo]
     [echo] ourwebapp build file
     [echo] ———————————–
     [echo]
     [echo] Available targets are:
     [echo]
     [echo] build     –> Build the application
     [echo] deploy    –> Deploy application as directory
     [echo] deploywar –> Deploy application as a WAR file
     [echo] install   –> Install application in Tomcat
     [echo] reload    –> Reload application in Tomcat
     [echo] start     –> Start Tomcat application
     [echo] stop      –> Stop Tomcat application
     [echo] list      –> List Tomcat applications
     [echo]

BUILD SUCCESSFUL
Total time: 0 seconds

Desplegamos la aplicación en el Tomcat con "ant deploy"

Z:\repo2\ourwebapp>ant deploy
Buildfile: Z:\repo2\ourwebapp\build.xml

build:

deploy:

BUILD SUCCESSFUL
Total time: 0 seconds

Y comprobamos que se haya desplegado bien con "ant list" (Este comando es el que falla sin las correciones puestas aqui dando diferentes errores como: 'java.io.FileNotFoundException: http://localhost:8080/manager/list' )

Z:\repo2\ourwebapp>ant list
Buildfile: Z:\repo2\ourwebapp\build.xml

list:
     [list] OK – Aplicaciones listadas para mßquinda virutal localhost
     [list] /:running:0:ROOT
     [list] /manager:running:0:manager
     [list] /ourwebapp:running:0:ourwebapp
     [list] /docs:running:0:docs
     [list] /examples:running:0:examples
     [list] /host-manager:running:0:host-manager

BUILD SUCCESSFUL
Total time: 0 seconds

Ahora puedes abrir un navegador y acceder a la pagina de inicio de la aplicacion en la siguiente URL: http://localhost:8080/ourwebapp/index.jsp.

Espero que os haya servido de ayuda 馃檪

2 thoughts on “Preparar proyecto web con Ant y Tomcat sin errores

  1. Buenas he seguido tus pasos y todo perfecto hasta que llego al "ant list" que me sale el error "401 for url java.io.FileNotFoundException: http://localhost:8080/manager/text/list", no se si tiene que ver con que estoy usando el tomcat de xampp y no estoy seguro de que tenga que realizar algo más.

    buid.properties

    *****************************

     

    # Ant properties for building the springapp

    appserver.home=C:/xampp/tomcat
    # for Tomcat 5 use $appserver.home}/server/lib
    # for Tomcat 6 use $appserver.home}/lib
    appserver.lib=${appserver.home}/lib

    deploy.path=${appserver.home}/webapps

    tomcat.manager.url=http://localhost:8080/manager/text
    tomcat.manager.username=tomcat
    tomcat.manager.password=s3cret

     

     

    Usuarios tomcat

    **************************

    <tomcat-users>
    <!–
      NOTE:  By default, no user is included in the "manager-gui" role required
      to operate the "/manager/html" web application.  If you wish to use this app,
      you must define such a user – the username and password are arbitrary.
    –>
    <!–
      NOTE:  The sample user and role entries below are wrapped in a comment
      and thus are ignored when reading this file. Do not forget to remove
      <!.. ..> that surrounds them.
    –>
    <!–
    <role rolename="manager-script"/>
    <role rolename="manager"/>
    <role rolename="admin"/>
    <role rolename="manager-gui"/>
    <user username="tomcat" password="s3cret" roles="manager-script,manager"/>
    <user username="miusuario" password="mipassword" roles="manager-gui"/>
    <user username="admin" password="admin" roles="admin"/>
    –>
    </tomcat-users>

     

     

    Muchas gracias de antemano

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *