|
| 
|
| El servidor de aplicaciones Tomcat de Apache y las tecnologías afines proporcionan a los programadores de Java un completo conjunto de herramientas para crear de forma rápida sofisticadas aplicaciones web. Con esta completa obra, descubrirá los problemas relacionados con la instalación, configuración y ejecución de Apache Tomcat. Este libro no sólo proporciona un análisis línea a línea de las opciones de configuración, sino que explora también sus funcionalidades y capacidades. Obtendrá las habilidades necesarias para resolver los problemas que surgen durante todas las fases de la administración de un sistema, lo que incluyen el alojamiento compartido, seguridad, pruebas de sistema y de eficiencia y los ajustes posteriores. Al centrarse exclusivamente en Tomcat 6, este libro le guiará por los últimos cambios arquitecturales y de eficiencia. Progresará desde los conceptos básicos y la configuración de aplicaciones web a técnicas más avanzadas para la creación de clústeres, la conectividad JDBC, bitácoras y mucho más. Todo esto nos ayudará a administrar y gestionar de forma efectiva nuestro servidor Tomcat.
Sobre los autoresIntroducción Cómo usar este libro Convenciones Código fuente 1. Apache Tomcat Orígenes humildes: El Proyecto Apache La Apache Software Foundation Tomcat Distribuir Tomcat: La licencia Apache Comparación con otras licencias GPL LGPL Otras licencias El marco principal: Java EE Las API de Java Java Community Process Las API de Java EE Servidores de aplicaciones Java EE Acordar los estándares, competir por la implementación Tomcat y los servidores de aplicaciones Tomcat y los servidores Web Resumen 2. Aplicaciones Web: Servlets, JSP y más Una breve historia de las aplicaciones Web Scripts CGI: El primer mecanismo de contenido dinámico Java en el servidor: Servlets La Interfaz Servlet Contenedores de servlets Acceder a los servlets Inconvenientes de los servlets JavaServer Pages Primeras aplicaciones Web: Arquitectura Modelo 1 Desarrollo Web Moderno: Arquitectura Modelo 2 y Frameworks Web Librerías de etiquetas JSP JSP EL Arquitectura MVC Utilizar tecnologías Web adecuadas Construir y distribuir aplicaciones Web Resumen 3. Instalación de Tomcat Instalar la JVM Instalar JVM en Windows Instalar la JVM en Linux Instalar la JVM desde un fichero tar.gz Instalar la JVM mediante el instalador RPM Instalar Tomcat Decidir qué distribución instalar Verificar el fichero descargado Instalador de Tomcat bajo Windows El componente Service Concluir la instalación Establecer las variables de entorno Probar la instalación Comprobar la instalación por defecto Asignar números de puerto Instalar Tomcat en Windows con el fichero ZIP Instalar Tomcat en Linux Probar la instalación por defecto Modificar números de puerto Construir Tomcat con el código fuente ¿Necesitamos construir Tomcat desde el código fuente? Descargar el código fuente El repositorio Subversion Construir el código fuente El directorio de instalación de Tomcat Instalar APR Errores típicos Error de versión de clase El número de puerto está en uso Ejecutar varias instancias Un Proxy bloquea el acceso Resumen 4. Arquitectura de Tomcat Visión general de los componentes de Tomcat El directorio bin El directorio conf Directorio lib Directorio logs Directorio temp Directorio webapps Directorio work La arquitectura de Tomcat El Servidor El Servicio Los Conectores El Motor El Realm Las Válvulas Los Loggers El Host El Contexto Resto de clases de la arquitectura de Tomcat Arquitectura de los conectores Rutas de comunicación Protocolos de los conectores Protocolos AJP El protocolo HTTP Escoger un conector Historia de AJP AJP JK webapp JK2 Proxy El ciclo de vida Interfaz del ciclo de vida Interfaz LifecycleListener Configuración por arquitectura Resumen 5. Configuración básica de Tomcat Configuración esencial de Tomcat 6 Ficheros en $CATALINA_HOME/conf Configuración básica del servidor Configuración del servidor por medio de server.xml El componente Servidor El componente Service El componente Conector Tomcat con configuración de servidor de aplicaciones El componente Motor El componente Realm El componente Host Definiciones de contextos de aplicaciones Web El fichero por defecto context.xml Autenticación y el fichero tomcat-users.xml El descriptor por defecto de despliegue, web.xml Configurar el servlet por defecto para recursos estáticos Configurar el servlet Invoker Configurar el JspServlet SSI y configuración de servlets CGI Asociar URL: mapeado de servlets Sinergia de server.xml, los descriptores de contexto y web.xml SSI y mapeados CGI Configuración de tiempo máximo de sesión Controlar el mapeado de MIME Simular el servidor Web Apache Control de acceso de granularidad fina: catalina.policy catalina.properties: Control de granularidad fina sobre comprobaciones de acceso Configuración de inicio Diferencia entre Configuración y Gestión La aplicación con GUI basada en Web de Tomcat 6 Resumen 6. Características avanzadas de Tomcat Válvulas. Estilo de intercepción de Tomcat Válvulas estándar Implementación de bitácoras de acceso Ámbito de los ficheros de bitácora Implementación del inicio de sesión único Registro múltiple sin la válvula de inicio único de sesión Configurar una válvula de inicio único de sesión Válvula de autenticación de formulario Restringir el acceso por medio de un filtro de peticiones Filtro de dirección remota Filtro de host remoto Configurar válvulas de filtro de peticiones Válvula de inspección de peticiones Sesiones persistentes Necesidad de sesiones persistentes Configurar un gestor de sesiones persistentes El elemento Configuración del gestor de sesiones persistentes Configuración de recursos JNDI ¿Qué es JNDI? Tomcat y JNDI Recursos JNDI típicos en Tomcat Configurar recursos por medio de JNDI El elemento El elemento El elemento El elemento Configurar una DataSource JDBC Configurar sesiones de correo electrónico Añadir una definición de recurso al descriptor de contexto de aplicación Añadir una referencia a un recurso de sesión de correo electrónico en el descriptor de despliegue Descargar e instalar las librerías JavaMail 1.3.3 y JavaBeans Activation Framework Compilar y configurar SendMailServlet Crear la JSP sendmail.jsp Enviar correo electrónico por medio de sesiones JavaMail Configurar clases de escucha de ciclo de vida Eventos de ciclo de vida enviados por los componentes de Tomcat El elemento Configuración de las clases de escucha de ciclo de vida de Tomcat 6 Mostrar MBeans generados por clases de escucha mediante el proxy de gestión JMX Eliminar clases de escucha de ciclo de vida por defecto Añadir una clase de escucha de ciclo de vida APR y configuración de motor SSL nativa Inicialización del procesador JSP Resumen7. Configuración de aplicaciones Web Comprender los contenidos de una aplicación Web Recursos públicos Asociación de URL El directorio WEB-INF El directorio classes El directorio tags El directorio lib El directorio META-INF El fichero de manifiestos El fichero de contexto Comprender el descriptor de despliegue (web.xml) El descriptor de despliegue de tipo Servlet 2.3 La cabecera XML La declaración DTD
El descriptor de despliegue Servlet 2.4/2.5 web-app context-param description display-name distributable ejb-local-ref ejb-ref env-entry error-page filter filter-mapping icon jsp-config listener locale-encoding-mapping-list login-config message-destination message-destination-ref mime-mapping resource-env-ref resource-ref security-constraint security-role service-ref servlet servlet-mapping session-config welcome-file-list Resumen8. Administración de aplicaciones Web Aplicación Web de ejemplo Aplicación manager de Tomcat Permitir el acceso a la aplicación manager Configuración de la aplicación Manager Entrada de contexto de la aplicación Manager Descriptor de despliegue de la aplicación manager Gestión de Tomcat: Interfaz Web Mostrar el estado del servidor de Tomcat Gestionar aplicaciones Web Desplegar una aplicación Web Gestión de Tomcat: Controlar aplicaciones con Ant Error común: Fallo de repliegue de aplicaciones Web bajo Windows Gestión de Tomcat: Utilizar peticiones HTTP Listar las aplicaciones desplegadas Desplegar una nueva aplicación Instalar/desplegar aplicaciones en Tomcat 6 Desplegar una nueva aplicación remotamente Desplegar una nueva aplicación desde una ruta local Recargar una aplicación existente Obtener una lista de recursos JNDI disponibles Obtener listas de propiedades del SO y de la JVM Detener una aplicación existente Iniciar una aplicación detenida Replegar una aplicación Web Mostrar las estadísticas de sesión Solicitar clases internas de Tomcat mediante el servlet Proxy JMX Ajustar las clases internas de Tomcat mediante el servlet Proxy JMX Errores posibles Consideraciones de recursos Distribución de despliegue de Tomcat Resumen 9. Cargadores de clases Visión general sobre los cargadores de clases Cargadores de clases Java SE estándar Cargador de clases bootstrap Cargador de clases de extensión Cargador de clases de sistema El modelo de delegación Mecanismo de sobrescritura estándar endorsado Más sobre el comportamiento de los cargadores de clases Carga perezosa (carga de clases bajo demanda) Caché de clases Nombres de espacio independientes Crear un cargador de clases personalizado ¿Por qué necesitamos un cargador de clases personalizado en Tomcat? Seguridad y cargadores de clases Delegación de cargadores de clases Restricción de clases núcleo Nombres de espacio de cargadores de clases independientes SecurityManager Tomcat y los cargadores de clases Cargador de clases de sistema Mecanismo de sobrescritura de estándares endorsados El cargador de clases comunes Cargador de clases de aplicación Web Detalles del cargador de clases de aplicación Web Revisión del orden de cargadores de clases Recarga de clases dinámica Problemas comunes de cargadores de clases Paquetes divididos entre varios cargadores de clases distintos Singletons Parsers de XML Resumen 10. Conectores HTTP Conectores HTTP Conector HTTP 1.1 de Tomcat 6 Configuración del conector HTTP/1.1 Configurar Tomcat 6 para SSL El conector NIO avanzado Soporte IO Asíncrono de Comet El conector APR nativo Activar el conector APR Atributos del conector configurables Optimización de la transferencia de ficheros Sendfile() en modo de núcleo Consultor de persistencia escalable Soporte OpenSSL Configurar el soporte CGI en Tomcat Configurar Tomcat para soporte SSI Configurar el Servlet SSI de Tomcat 6 Configurar un filtro SSI de Tomcat 6 Ejecutar Tomcat detrás de un servidor proxy Ajustes de eficiencia Atributos de configuración ajustables Consejos de ajuste para la pila TCP/IP Ajuste de pila Windows XP o Server 2003 TCP Ajuste de pila TCP bajo Linux Servidor Web front-End para Tomcat 6 Resumen 11. Tomcat y el servidor HTTP Apache La arquitectura del conector AJP Los módulos de código nativo de Apache El protocolo JServ de Apache El conector AJP Servidor Web Apache front-end o Tomcat en modo standalone Workers de Tomcat Varios worker de Tomcat Configurar el servidor Apache para que funcione con los worker de Tomcat, el fichero workers.properties El formato del fichero workers.properties Tipos de worker Otras propiedades de worker Conectar Tomcat con Apache Configuración de Tomcat 6 Configurar el conector AJP 1.3 en server.xml Configuración del servidor Web Apache Utilizar el módulo mod_jk Binarios de mod_jk en código nativo para el servidor Apache Añadir directivas para cargar el módulo mod_jk (httpd.conf) Directivas mod_jk adicionales Probar la configuración de mod_jk Utilizar el módulo mod_proxy Configurar el módulo mod_proxy en el servidor Apache 2.2.x para el protocolo AJP Configurar SSL para el servidor Web Apache Configurar mod_ssl para Apache Verificar la instalación OpenSSL Construir Apache con soporte mod_ssl desde el código fuente Generar un certificado de prueba con OpenSSL Configurar mod_ssl en Apache Probar la configuración de Apache con SSL Advertencias de seguridad del navegador Configuración de Apache-Tomcat con SSL Equilibrio de carga con Apache Cambiar CATALINA_HOME en los ficheros de inicio de Tomcat Asignar puertos diferentes para el conector AJP Establecer puertos de servidor distintos Desactivar el conector HTTP/1.1 por defecto Ajustar la jvmRoute en el motor standalone Comentar el motor Catalina Directivas en httpd.conf Configuración de los worker en workers.properties Configurar instancias de worker de Tomcat Configurar el equilibrio de carga en workers.properties Configurar un worker de estado en workers.properties Añadir a mod_jk un elemento workers.list Fichero workers.properties completo Probar la distribución de carga Probar la persistencia de sesión Probar el comportamiento round-robin Pruebas con diferentes factores de carga Resumen 12. Tomcat e IIS Participación del plug-in ISAPI Conectar Tomcat con IIS Verificar las instalaciones de IIS y Tomcat Configurar el conector JK Instalar el plug-in ISAPI Configurar los worker de Tomcat Configurar las reglas de envío de peticiones Configurar opcionalmente las reglas de reescritura de URL Actualizar el registro de Windows para el plug-in ISAPI Editar el registro manualmente Editar el registro con un script Modo de aislamiento de IIS 5 (solo IIS 6) Generar un directorio virtual mediante IIS Añadir el plug-in ISAPI como filtro IIS Autorización de extensión de aplicación Web al plug-in ISAPI (solo en IIS 6) Probar la configuración final Consejos de soporte técnico Utilizar SSL Arquitecturas escalables con IIS y Tomcat Distribuir los despliegues de servidores Web y de aplicaciones Varios worker de Tomcat Worker AJP de distribución de carga Resumen 13. Conectividad JDBC JDBC básico Establecer y finalizar conexiones con SGBDR Evolución de las versiones JDBC Tipos de driver JDBC Pool de conexiones de bases de datos Problemas de los pool de conexiones Tomcat y la evolución JDBC Emulación JNDI y los pool en Tomcat 6 Configuración recomendada: Recursos JNDI La etiqueta Resource Trabajar con otros SGBDR DBCP, soporte de Jakarka Commons Pooling Transacciones y soporte de transacciones distribuidas Configuración de recursos JNDI Crear la base de datos de pruebas MySQL Crear el usuario de solo lectura Añadir un recurso JNDI JDBC al contexto por defecto Paso 3: Utilizar JNDI para buscar una fuente de datos Probar la configuración del recurso JNDI La página de error en acción Configuración JDBC alternativa Gestores de pool de conexiones alternativos Sobre el gestor de pool c3p0 Desplegar el gestor de pool c3p0 Obtener conexiones JDBC sin búsquedas JNDI Probar acceso a pool sin JNDI con c3p0 Obtener una conexión con asociaciones JNDI Probar c3p0 con una búsqueda compatible con JNDI de Tomcat 6 Desplegar pool externos Resumen 14. Seguridad de Tomcat Verificar la integridad de descarga de Tomcat Verificar la función resumen MD5 Utilizar PGP para verificar la descarga Asegurar la instalación del servidor Tomcat Eliminar aplicaciones por defecto ROOT y tomcat-docs Aplicaciones del sistema, manager y host-manager Gestionar la seguridad de acceso a aplicaciones del sistema Eliminar ejemplos de JSP y Servlet Cambiar el comando SHUTDOWN Ejecutar Tomcat con una cuenta especial Generar un usuario de Tomcat sin privilegios Ejecutar Tomcat con el usuario tomcat Configurar Windows Configurar Linux Asegurar el sistema de ficheros Sistema de ficheros de Windows Listas de control de acceso Restringir permisos Conceder permisos Sistema de ficheros de Linux Seguridad de la máquina virtual de Java Introducción al gestor de seguridad Conceder permisos a las aplicaciones Sintaxis de la entrada grant Permisos disponibles Activar el sistema del gestor de seguridad Temas avanzados del gestor de seguridad Utilizar el gestor de seguridad en Tomcat Activar el gestor de seguridad de Tomcat Fichero de políticas de Tomcat Prácticas recomendables sobre el gestor de seguridad Utilizar el gestor de seguridad Comprender requerimientos de aplicación Activar la creación de un cargador de clases Activar los driver JDBC para abrir conexiones de socket a bases de datos Enviar correo electrónico con JavaMail Leer o escribir ficheros fuera del directorio de la aplicación Web Proteger aplicaciones Web Autenticación y Realm Mecanismos de autenticación Formularios Configurar la autenticación Formulario de autenticación Realm de seguridad Usuarios y roles Realm basado en fichero: UserDatabase Realm JDBC Realm JNDI Realm JAAS Inicio de sesión único Cifrado SSL JSSE Preparar el almacén de claves de certificado Instalar un certificado de una autoridad de certificados Proteger recursos con SSL Configuración de Tomcat Proteger DefaultServlet Desactivar el listado de directorios Desactivar el servlet de invocación, el Gateway CGI y SSI Restricciones de Host Resumen 15. Alojamiento compartido en Tomcat Conceptos de alojamiento virtual Alojamiento virtual en Apache Escenario de despliegue de ejemplo Alojamiento virtual basado en IP en Apache Configurar el alojamiento virtual basado en IP en Apache Probar nuestra configuración Evitar errores comunes Alojamiento virtual basado en nombres en Apache Configurar el alojamiento virtual basado en nombres en Apache Probar la configuración Evitar problemas comunes Alojamiento virtual en Tomcat Escenario de despliegue de ejemplo Tomcat en modo standalone Alojamiento virtual basado en nombres en Tomcat Alojamiento virtual basado en IP en Tomcat Tomcat con Apache Configurar Apache La aplicación host-manager de Tomcat Alojamiento virtual: estabilidad, seguridad y eficiencia Ajustar la configuración de alojamiento virtual en Tomcat Generar JVM independientes para cada host virtual Establecer límites de memoria en la JVM de Tomcat Factores que determinan los requerimientos de memoria Ajustar límites de memoria en Tomcat Utilizar restricciones en el gestor de seguridad de Java Resumen 16. Monitorización y gestión de Tomcat con JMX La necesidad de gestión Todo sobre JMX La arquitectura JMX Nivel de instrumentación Nivel de agente El servidor de MBean Conectores y adaptadores de protocolo Servicios de agente Nivel de servicios distribuidos API remota JMX Antología de los MBean MBean estándar MBean dinámico MBean modelo MBean abierto Elementos de gestión JMX en Tomcat 6 Componentes de la arquitectura de Tomcat 6 Service Server Engine Connector Host Componentes anidados Realm Valve Manager Objetos de datos de tiempo de ejecución UserDatabase User Role Objetos de recurso NamingResources Environment Resource ResourceLink Objetos relacionados con las aplicaciones WebModule Servlet Objetos internos de Tomcat RequestProcessor Cache ThreadPool Acceder al soporte JMX de Tomcat 6 mediante el proxy de gestión Trabajar con el proxy JMX Modificar atributos de un MBean Utilizar el GUI jconsole para monitorizar Tomcat Conectar con una instancia local de Tomcat Localizar los MBean expuestos de Tomcat 6 Cambiar los valores de atributo de componente mediante jconsole Configurar Tomcat para la monitorización remota Seguridad de la conexión de gestión remota mediante SSL y autenticación de usuario Resumen 17. Clústeres Beneficios de los clústeres Escalabilidad y los clústeres Necesidad de alta disponibilidad Conceptos básicos Patrón topológico maestro-copia de seguridad Patrón de comportamiento de recuperación de caídas El modelo de clústeres de Tomcat 6 Distribución de carga Distribución de carga mediante mod_proxy/mod_jk y sesiones persistentes Sesiones acopladas Compartir sesiones Sesiones acopladas sin compartir sesión Sesiones acopladas con un gestor de sesiones persistentes y un almacén compartido de ficheros Sesiones acopladas con un gestor de sesiones persistentes y un almacén JDBC de un SGBDR Replicación de sesiones en memoria Utilizar clústeres en Tomcat 6 Gestión de sesiones en Tomcat 6 El rol de las cookies y los navegadores modernos Configurar un clúster en Tomcat 6 Generar varias instancias de Tomcat 6 en la misma máquina Detener el clúster de Tomcat Configurar aplicaciones Web mínimas Desactivar los conectores HTTP Configurar los puertos TCP de AJP para las instancias Tomcat del clúster Ajustar el atributo jvmRoute para cada instancia de Tomcat Configurar el atributo para las aplicaciones Web Consistencia de configuración Front-end común: distribución de carga mediante mod_jk Configuración del servidor Apache Configuración de mod_jk Ruta de asociación al worker de distribución de carga mediante JkMount Preparación para usar diferentes back-end para compartir sesión Back-end 1: Configuración de replicación en memoria Operación de SimpleTcpCluster de Tomcat 6 Configuración del gestor de sesión del clúster con un elemento Un elemento de replicación La válvula JvmRouteBinderValve El desplegador Las clases de escucha del clúster Configurar la página JSP para la replicación de sesión de Tomcat Probar el cluster de replicación de sesión en memoria de Tomcat 6 Recuperación de caídas Observar la distribución de carga de las peticiones Back-end 2: Gestor de sesiones persistentes con un almacén compartido de ficheros Configurar el elemento El componente anidado Probar un clúster de sesiones persistentes basadas en un sistema compartido de ficheros Observar una recuperación normal Observar una recuperación de un fallo repentino Back-end 3: Gestor de sesiones persistentes con un almacén JDBC Probar un clúster de Tomcat con un back-end con gestor de sesiones persistentes basado en JDBC La complejidad de los clústeres Los clústeres y la eficiencia Los clústeres y el tiempo de respuesta Resolver problemas de eficiencia con un clúster Resumen18. Tomcat empotrado Importancia del empotramiento en el diseño de sistemas modernos Escenarios de aplicación empotrados Desarrollo mediante Tomcat empotrado Tomcat empotrado mediante programación Ejecutar el ejemplo MyWebServer Resumen 19. Bitácoras Cambios con respecto a Tomcat 5 log4j Arquitectura log4j Logger Appender Nivel Filtro Layout Instalación y configuración de log4j Configuración log4j Utilizar un fichero simple de propiedades Programación de log4j Utilizar el fichero de configuración XML Tutorial de log4j Más usos de log4j Bitácoras desde una aplicación Web Envío de mensajes de bitácora a la consola Ficheros de bitácora Varios destinos de bitácora Cambiar de fichero de bitácora, según el tamaño Cambiar de fichero de bitácora, según la fecha Clasificar los mensajes de bitácora por nivel Bitácoras de paquetes o clases concretas de la aplicación Formato personalizado de mensajes de bitácora Mensajes de bitácora HTML Mensajes de bitácora por correo electrónico Bitácoras de NT Event Agregar información de contexto adicional mediante contextos de diagnóstico anidados Ver o consultar ficheros de bitácora Consejos de eficiencia para log4j JULI Arquitectura de las bitácoras de Java Logger Handler Nivel Filter Formatter Tutorial de JULI Análisis de ficheros de bitácora Resumen 20. Pruebas de eficiencia Conceptos de eficiencia ¿Qué medir? Escalabilidad y eficiencia Comprender la perspectiva del usuario Medir la eficiencia JMeter Instalar y ejecutar JMeter Crear y comprender los planes de pruebas de JMeter Características de JMeter Temporizador Listener Controlador Lógico Muestreador Elemento de Configuración Aserciones Servidor proxy HTTP Pruebas de carga distribuida Interpretar los resultados de las pruebas Establecer objetivos de pruebas y contrastarlos Establecer limitaciones de escalabilidad Análisis posterior Alternativas a JMeter ¿Qué hacer después de probar la eficiencia? Resumen 21. Ajuste de eficiencia Recomendaciones para el ajuste de eficiencia Paso 1: Establecer un banco de pruebas Paso 2: Probar la eficiencia e identificar la base Paso 3: Diagnosticar cuellos de botella de eficiencia Diagnosticar problemas de eficiencia de Tomcat Consejos de ajuste de eficiencia para Tomcat Ajustar los parámetros de la JVM La máquina virtual servidor Optimizar la asignación de memoria Escoger una JVM de un desarrollador diferente Precompilar JSP Ajustar la configuración de Tomcat Configuración del conector Conectores de alta eficiencia Ajustar la configuración de las JSP Desactivar la recarga y despliegue automático de las aplicaciones Web Utilizar servidores Web para contenido estático, cuando proceda Resumen A. Tomcat y los IDE Eclipse Depurar una aplicación Web remota en Eclipse Desplegar y depurar aplicaciones Web locales mediante el plug-in de Tomcat Sysdeo Desplegar y depurar aplicaciones Web mediante WTP Gestionar el despliegue de aplicaciones Web mediante Apache Ant y Eclipse NetBeans Depurar una aplicación Web remota en NetBeans Depurar una aplicación Web desde NetBeans Resumen B. Apache Ant Instalar Ant Introducción a Ant Más opciones de línea de comandos Técnicas Ant Construir aplicaciones Web con Ant Compilar JSP Reutilizar script Ant mediante ficheros de propiedades y parámetros de línea de comandos Script reutilizables para distintos sistemas operativos (Unix/Linux, Windows) Script reutilizables para varios entornos: desarrollo, QA, montaje y producción Bitácoras de construcción Notificaciones de construcción por correo electrónico Ant y sistemas de control de código fuente Pruebas automatizadas Integración continua Referencia de tareas Ant Resumen Índice alfabético
Otros clientes que compraron Apache Tomcat 6, también compraron: |
 | Apache Coar, Ken ; Bowen, Rich. 352 páginas.
| | Precio: 27,6 € ($43,32) |
Otros libros de Internet: |
 | Blogger Della Chiesa, Walter. 320 páginas.
| | Precio: 13,3 € ($20,87) |
*Para península. Tiempo estimado para días laborables |
|