2010-05-13 38 views
5

Estoy tratando de encontrar la forma óptima de desarrollar y lanzar una aplicación web bastante simple, y me estoy enfrentando a varios problemas. Esbozaré las decisiones que tomé, porque en algún lugar claramente me he salido de la pista. ¡Enormemente agradecido por cualquier ayuda!mejores prácticas de la aplicación web java

Tengo lo que creo que es una aplicación web bastante simple. Contiene un par de jsps que hacen referencia a un par de beans Java, y los habituales html, js, css e imágenes estáticos.

Decisión 1) Quería tener un procedimiento de liberación claro y limpio, de modo que pudiera desarrollar en mi máquina local y luego liberar confiablemente a una máquina de producción. Por lo tanto, tomé la decisión de empaquetar la aplicación en un archivo de guerra (incluidos todos los recursos estáticos), para minimizar los bits y piezas independientes que tendría que liberar. ¿Hasta aquí todo bien?

Decisión 2) Quería que las cosas en mi máquina local fueran lo más similares posible al entorno de producción. Por lo tanto, en mi html, por ejemplo, puedo tener una referencia a un archivo estático como http://static.foo.com/file. Para que este código funcione a la perfección en dev y prod, decidí poner static.foo.com en mi/etc/hosts cuando me desarrollo localmente, para que todas las direcciones URL funcionen correctamente sin cambiar nada.

Decisión 3) Decidí usar eclipse y maven para darme un entorno de mejores prácticas para la administración y construcción de mi proyecto.

Así que tengo una buena apretada establecido ahora, excepto que:

Cada vez que quiero cambiar nada en el desarrollo, como una línea en un archivo html, tengo que reconstruir todo el proyecto y luego esperar Tomcat para cargar la guerra antes de que pueda ver si es lo que quería. Entonces mis preguntas son:

1) ¿Hay alguna manera de conectar el eclipse y el gato para que no tenga que reconstruir la guerra cada vez? es decir, ¿Tomcat está mirando directamente a mi espacio de trabajo real para servir los archivos estáticos?

2) Creo que estoy haciendo las cosas más difíciles utilizando/etc/hosts para reflejar las direcciones de producción: ¿hay una forma mejor que no implique el cambio manual de URL (las URL relativas están bien, por supuesto, pero donde usted tiene muchos subdominios, digamos uno para archivos estáticos y uno para dinámico, ¿tiene que escribir la ruta completa, seguramente?)

3) ¿Es esta la mejor práctica? ¿Cómo se configuran las cosas para que equilibren los requisitos de un proceso de compilación automatizado que lo abarque todo, por un lado, y la velocidad y flexibilidad para poder desarrollar javascript y html y css rápidamente, tan rápido como si uno acaba de señalar Apache en el directorio y desarrollado en vivo? ¿Qué encuentra la gente que funciona?

¡Muchas gracias!

Edit: ¡Gracias a todos por sus excelentes respuestas! Si pudiera marcarlos bien, lo haría ... Esto realmente me ha ayudado. Lo que estoy escuchando es que la mejor práctica es conservar la estructura de la aplicación web en desarrollo y ejecutarla en un entorno lo más cercano posible a la producción. Parece que las diferencias entre las personas son la medida en que las personas están dispuestas a implementar recursos en caliente en el contenedor de servlets, eludiendo el proceso de compilación para un poco de velocidad o conveniencia extra. Eso tiene sentido. Gracias de nuevo.

Respuesta

3

Para contestar # 1, sugeriría lo siguiente:

  1. pasar algún tiempo aprendiendo experto para construir su .war sin eclipse. No es tan difícil con el arquetipo correcto.Vea aquí para más detalles: http://maven.apache.org/guides/mini/guide-webapp.html
  2. Maven puede generar proyectos de Eclipse ya sea a través mvn eclipse:eclipse o utilizando el plugin m2
  3. Para el despliegue en el equipo local y para la producción, utilizar el plugin de carga experto. http://cargo.codehaus.org/Maven2+plugin y http://blank.jasonwhaley.com/2010/03/automated-deployment-with-cargo-drive.html

Para responder a la pregunta # 2, no hay nada malo con la modificación de su archivo/etc/hosts para imitar la producción. Solo tiene una secuencia de comandos rápida que le permite agregar/eliminar esas entradas y vacía su caché dns. Hago exactamente eso todo el tiempo. (asegúrese de hacer que su navegador borre su caché frecuentemente también a través de su configuración relevante).

Para responder a la pregunta 3) sí, así es como deberían estar haciendo las cosas. Cada compilación debería dar como resultado un único artefacto desplegable que puede implementar en cualquiera de sus entornos en un solo paso. Debe asegurarse de poder hacer esto sin su IDE y usar el IDE solo como una herramienta para ayudarlo durante la fase de desarrollo.

+0

Gracias Whaley.Así que estoy claro, ¿está confirmando que incluso si quiero, por ejemplo, poner una alerta rápida en una línea de javascript, o corregir un error tipográfico en algún texto en un archivo html, tendré que esperar a que termine la guerra? reconstruir y luego ser desplegado (incluso si es automáticamente) a mi contenedor de servlets de desarrollo, y solo entonces puedo ver el resultado de mi cambio? Si es así, eso se siente muy forzado en comparación con la eficiencia de tener algo apuntando directamente a los archivos del proyecto. ¿He entendido bien o me estoy perdiendo algo? – Jeremy

+0

Eso es precisamente lo que estoy sugiriendo. Si su despliegue de producción consiste en reducciones de .war, así es como debería verse su implementación de desarrollo. Los webapps de Java están destinados a ser agrupados y desplegados como de guerra. Encuentro que la vida siempre es mucho más fácil cuando no intentas evitar esa convención. – whaley

+0

Al usar la edición webtools/EE de Eclipse, puede "vincular" su proyecto con una instalación local de tomcat (u otro contenedor), de modo que pueda obtener una vista previa de pequeños cambios sin esperar la generación/implementación de guerra. – agnul

4

¿Hay una manera de conectar hasta Eclipse y Tomcat para que yo no tengo que reconstruir la guerra cada vez?

1) Creo que confía demasiado en su IDE. Por lo general, tengo Ant build.xml que tiene un par de tareas: una es "construir guerra" y la otra es "actualizar jsps". Building the war compila todo el código, lo empaqueta, lo implementa en Tomcat y reinicia todo. La actualización de jsps no reinicia el servidor, es solo una copia directa de mis archivos locales a la instancia implementada de Tomcat. No es necesario reiniciar ya que son JSP. Toma aproximadamente medio segundo.

donde tiene muchos subdominios, dicen uno para archivos estáticos y uno para dinámico, hay que escribir la ruta completa , ¿verdad?

2) De ninguna manera, José. ¿Quiere decir que cada vez que cambia el nombre del servidor, debe volver a compilar su código? Si necesita admitir URL dinámicas, es posible que solo quiera aprovechar la oportunidad y echar un vistazo a un marco para hacer el trabajo pesado por usted. Soy parcial a Stripes (que admite la reescritura dinámica de URL desde el primer momento) ... hay otros.

+0

Lo siento, no fui muy explícito sobre el punto de urls del subdominio. Lo que quiero decir es que si solo tienes urls relativas en tu código como href = file.html, entonces esas funcionan igualmente en dev y prod. Pero si tiene un archivo f.html ubicado en www.foo.com, cuyo html hace referencia a un archivo f2.html ubicado en STATIC.foo.com, p. Ej. Href = http: //STATIC.foo.com/f2.html, luego puedes hacer que esas URL sigan funcionando bien en dev y prod poniendo entradas en tu archivo/etc/hosts como lo siguiente: 127.0.0.1 www.foo.com STATIC.foo.com Ahora en dev, esas urls todas resuelven a su máquina local, que es lo que quiere, SIN cambiar el código. – Jeremy

+0

Si absolutamente debe especificar la URL completa, creo que su método actual es probablemente el mejor. Definitivamente tomaría los consejos de Whaley sobre: ​​automatizar esa parte del proceso. –

4

Esto es muy parecido a lo que tengo que hacer en el trabajo, aunque usamos la hormiga (¿por ahora?). Además, mientras uso un IDE (o dos), I rechazo para tener uno como parte de mi proceso de compilación, NUNCA. Alguien tiene que ser capaz de entender y ajustar tu construcción.

+0

Descargo de responsabilidad: rompería el "no IDE build" para un proyecto de juguete/desechable. Pero no por algo lanzado a un entorno de trabajo de producción. – Roboprog

2

Otros ya se han contestado, sólo voy a comentar en este (esto demasiado largo para un comentario cierto modo me como una respuesta):

Cada vez que quiero cambiar nada en el desarrollo, como una línea en un archivo html , tengo que reconstruir el proyecto completo y luego esperar Tomcat para cargar la guerra antes de que pueda ver si es lo que quería.

Si cambia una línea en un archivo html, no hay necesidad de reconstruir todo el proyecto.

Nota que siempre reconstruir la plena .war y volver a desplegar mi .war pero esto lleva menos de dos segundos (menos de un segundo para rezip el .war [eso es realmente lo que es un .war es decir, un archivo comprimido] y menos de un segundo para volver a implementarla) porque:

  • que no es necesario volver a compilar todo el proyecto en las que simplemente cambiar una línea en un archivo html

mismo cuando Usted cambia un archivo .java: simplemente puede recompilar ese archivo y volver a la guerra.

Escribí mi propio archivo de compilación Ant desde cero (no Maven aquí) y tengo varios objetivos. Puedo forzar una "compilación limpia", que volverá a compilar todo, pero normalmente estoy reempaquetando y redistribuyendo el .war

Puede comprobarlo usted mismo: compilar un .war, descomprimirlo en, digamos, directorio dir1, luego modifique un .html (o un archivo .java/.class) y cree un nuevo .war y descomprima ese nuevo .war en, digamos, dir2.

luego comparar dir1 y directorio2: ahora arreglar el proceso de compilación por lo que puede crear ese segundo .war sin necesidad de volver a compilar todo.

Cambiar un archivo .html, .java, .jsp, .css, .js/whatever y volver a desplegar un nuevo .war debería ser una cuestión de segundos (menos de dos segundos si no arrojó el fregadero de la cocina en su Webapp).

Tenga en cuenta que en el mismo proyecto, otro desarrollador aquí prefiere "implementar en caliente"/reemplazar los archivos directamente en la aplicación web explosionada (prefiero volver a desplegar un .war cada vez y porque mi completo reenvasado/redespliegue lleva menos de dos segundos estoy bien con eso de esa manera).

+0

Vaya, se olvidó de precisar: tengo una estación de trabajo * realmente * rápida con una gran cantidad de memoria, por lo que las cosas tienden a ser más rápidas que en mis sistemas de compañeros de trabajo (que están en OS X MacBook Pro, máquinas finas) , pero no tan rápido como mi sistema) :) Pero aún así, todo debería ser cuestión de unos segundos. [por cierto tengo un MBP también cuando estoy huyendo: esta no es una foto barata en Apple] – SyntaxT3rr0r

2

No necesita reconstruir el archivo war si su proyecto es una aplicación web dinámica en Eclipse y el servidor Tomcat configurado correctamente. Siga las instrucciones siguientes:

1) Confirmar el abajo de cómo configurar el servidor Tomcat con Eclipse: http://greatwebguy.com/programming/eclipse/make-eclipse-and-tomcat-play-nice-together/

2) utilizar rutas relativas para su aplicación sino caminos no absolutos.

3) Si sigue los 2 pasos anteriores correctamente, entonces tiene un mejor entorno para el desarrollo.

1

durante el desarrollo, debe configurar eclipse y tomcat para que no se requiera la reconstrucción/redeloy. simplemente modifique html/css/jsp etc, guarde y actualice el navegador para ver el resultado.

pero antes de implementar en el sitio de producción, debe hacer una compilación completa limpia y probarla cuidadosamente.

dominios: deben estar en un archivo de configuración; dev y prod deberían tener diferentes archivos de configuración.

Cuestiones relacionadas