2008-10-02 9 views
5

Tenemos el web.xml para nuestra aplicación web que incluye algunos archivos de etiquetas jsp y jsp. Quiero pasar a usar jsp precompilados. Tengo la compilación previa en la compilación, y genera el fragmento web.xml y ahora quiero fusionar el fragmento en el web.xml principal.Cómo fusionar jsp fragmento web.xml precompilado con web.xml principal usando Ant

¿Existe un incluyen directiva tipo para Web.xml que me permita incluir el fragmento.

Idealmente, dejaré las cosas como están para DEV- ya que es útil cambiar las jsp sobre la marcha y ver los cambios inmediatamente, pero luego para UAT/PROD, las jsp serán precompiladas y, por lo tanto, funcionarán más rápido.

Respuesta

4

Uso el Tomcat jasper ANT tasks en mi proyecto, que precompila los JSP en servlets y agrega las nuevas asignaciones de servlets al web.xml original. En las compilaciones DEV, solo omita este paso e implemente las JSP sin precompilación y modificación de web.xml.

<?xml version="1.0"?> 
<project name="jspc" basedir="." default="all"> 
<import file="${build.appserver.home}/bin/catalina-tasks.xml"/> 

<target name="all" depends="jspc,compile"></target> 

<target name="jspc"> 
    <jasper 
    validateXml="false" 
    uriroot="${build.war.dir}" 
    webXmlFragment="${build.war.dir}/WEB-INF/generated_web.xml" 
    addWebXmlMappings="true" 
    outputDir="${build.src.dir}" /> 
</target> 

<target name="compile"> 
    <javac destdir="${build.dir}/classes" 
    srcdir="${build.src.dir}" 
    optimize="on" 
    debug="off" 
    failonerror="true" 
    source="1.5" 
    target="1.5" 
    excludes="**/*.smap"> 
    <classpath> 
    <fileset dir="${build.war.dir}/WEB-INF/classes"> 
    <include name="*.class" /> 
    </fileset> 
    <fileset dir="${build.war.lib.dir}"> 
    <include name="*.jar" /> 
    </fileset> 
    <fileset dir="${build.appserver.home}/lib"> 
    <include name="*.jar" /> 
    </fileset>  
    <fileset dir="${build.appserver.home}/bin"> 
    <include name="*.jar"/> 
    </fileset> 
    </classpath> 
    <include name="**" /> 
    <exclude name="tags/**"/> 
    </javac> 
</target> 

<target name="clean"> 
    <delete> 
    <fileset dir="${build.src.dir}"/> 
    <fileset dir="${build.dir}/classes/org/apache/jsp"/> 
    </delete> 
</target> 
</project> 

Si ya tiene el trabajo de compilación de JSP y sólo quiere fusionar los archivos web.xml, un XSLT simple podría ser escrita para agregar elementos seleccionados (como las asignaciones de servlets) de la web recién generado, xml en tu original.

4

Doh - hay una opción en la tarea jasper2 para auto-fusionar el fragmento en el web.xml principal - addWebXmlMappings

<jasper2 
     validateXml="false" 
     uriroot="${web.dir}" 
     addWebXmlMappings="true" 
     webXmlFragment="${web.dir}/WEB-INF/classes/jasper_generated_web.xml" 
     outputDir="${web.dir}/WEB-INF/jsp-src" /> 

Me pregunto lo bien que la fusión es ...

Es molesto que necesites generar el fragmento aún, aunque no sea necesario después de esta tarea.

+0

Lo bueno es que me desplacé hacia abajo, esto era exactamente lo que estaba buscando. OP debería considerar cambiar la respuesta aceptada. Para responder a su pregunta, la fusión fue limpia en mi caso. Pone todo entre limpias '' comentarios. –

4

Dado que el fragmento generado no es un archivo XML válido (después de todo, es un fragmento), no es posible usar XSLT directamente. Por otro lado, no es necesario. Aquí hay un truco simple que le dará exactamente lo que necesita.

En su archivo web.xml, inserte el comentario XML <!-- @[email protected] --> entre <servlet> y <servlet-mapping> elementos, p. Ej.

<servlet> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>my.servlets.MyServlet</servlet-class> 
    <servlet> 

    <!-- @[email protected] --> 

    <servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/my-servlet</url-pattern> 
    </servlet-mapping> 

A continuación, utilice un filtro de contadores a reemplazar @[email protected] la etiqueta con el contenido generado.

<loadfile 
    property="generated.web.xml.fragment" 
    srcFile="${generated.fragment.file}" 
/> 

<copy file="${orig-web-content.dir}/WEB-INF/web.xml" 
    toFile="${generated-web-content.dir}/WEB-INF/web.xml" 
> 
    <filterset> 
    <filter token="JSPS_MAP" 
     value=" --&gt; ${generated.web.xml.fragment} &lt;!-- " 
    /> 
    </filterset> 
</copy> 

Este enfoque tiene la ventaja de que el archivo web.xml original es completamente válido (una etiqueta se esconde en el comentario), pero le da un control total de dónde y cuándo se va a insertar el fragmento generado.

Por lo tanto, para la compilación DEV, solo copie ${orig-web-content.dir}/WEB-INF/web.xml en ${generated-web-content.dir}/WEB-INF/web.xml sin filtrar.

1

Hay jasper2 tarea de hormiga que otros han observado. Pensé que mencionaría algunas otras opciones que he encontrado.

Uno es cactus 'webxmlmerge tarea ant, que utiliza org.codehaus.cargo.module.webapp.WebXmlMerger

Otro sería utilizar JAXB para manipular el web.xml; La demo dtd-schemas-generator de Sebastien Dionne hace esto. No estoy seguro de lo que es la licencia.

fwiw habiendo considerado estas opciones creo que voy a utilizar la tarea ant XSLT.

1

En su archivo web.xml si tiene etiquetas para especificar dónde se inicia y finaliza la fusión, el indicador addWebXmlMappings generará el archivo correctamente para usted. Las etiquetas son: < - JSPC asignaciones de servlets en Inicio -> y < - JSPC servlet asignaciones finales -> después de hacer esto a mi web.xml todo funcionaba como un encanto! (Tengo que mirar el código para org.apcahe.jasper.JspC para ver cómo se implementó esto)

+0

Las etiquetas son ... ¿qué? –