Comment fusionner un fragment web.xml pré-compilé avec le fichier web.xml principal à l'aide de Ant

StackOverflow https://stackoverflow.com/questions/162079

Question

Nous avons l'habituel web.xml pour notre application Web, qui comprend des fichiers de balises jsp et jsp. Je veux passer à l’utilisation de jsp précompilés. La pré-compilation se passe dans la version ok, elle génère le fragment web.xml et je souhaite maintenant le fusionner dans le fichier web.xml principal.

Existe-t-il une directive de type inclure pour web.xml qui me permette d'inclure le fragment?

Idéalement, je laisserai les choses telles quelles pour DEV car il est utile de changer les jsp à la volée et de voir les modifications immédiatement, mais pour UAT / PROD, les jsp seront pré-compilées et fonctionneront donc plus rapidement.

Était-ce utile?

La solution

J'utilise les tâches ANT de Tomcat jasper dans mon project, qui précompile les fichiers JSP en servlets et ajoute les nouveaux mappages de servlets au fichier web.xml d'origine. Dans les versions de DEV, ignorez simplement cette étape et déployez les fichiers JSP sans pré-compilation ni modification du fichier 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 la compilation JSP fonctionne déjà et que vous souhaitez simplement fusionner les fichiers web.xml, vous pouvez créer un XSLT simple pour ajouter des éléments sélectionnés (tels que les mappages de servlets) du fichier XML nouvellement généré à votre fichier d'origine.

Autres conseils

Doh - il existe une option dans la tâche jasper2 pour fusionner automatiquement le fragment dans le fichier web.xml - 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" />

Je me demande à quel point la fusion est bonne ...

Malheureusement, vous devez générer le fragment, même s'il n'est pas nécessaire après cette tâche.

Le fragment généré n’étant pas un fichier XML valide (c’est un fragment après tout), il n’est pas possible d’utiliser directement XSLT. D'autre part, vous n'êtes pas obligé. Voici un truc simple qui vous donnera exactement ce dont vous avez besoin.

Dans votre fichier web.xml, insérez un commentaire XML <!-- @JSPS_MAP@ --> entre <servlet> et <servlet-mapping> éléments, par exemple

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

  <!-- @JSPS_MAP@ -->

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

Utilisez ensuite un filtre de jeton pour remplacer @JSPS_MAP@ balise par le contenu généré.

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

Cette approche présente l'avantage que le fichier web.xml d'origine est totalement valide (une balise est masquée dans le commentaire), mais vous permet de contrôler totalement où et quand le fragment généré sera inséré.

Donc, pour la construction de DEV, il suffit de copier ${orig-web-content.dir}/WEB-INF/web.xml vers ${generated-web-content.dir}/WEB-INF/web.xml sans filtrer.

Il y a la jasper2 tâche que d'autres ont notée. Je pensais mentionner quelques autres options que j'ai trouvées.

L'une est la tâche webxmlmerge de cactus, qui utilise org.codehaus.cargo.module.webapp.WebXmlMerger

Une autre solution consisterait à utiliser JAXB pour manipuler le fichier web.xml. La démonstration de dtd-schemas-generator de Sébastien Dionne fait cette démonstration. . Vous ne savez pas exactement quelle est la licence.

Après avoir examiné ces options, je pense que je vais utiliser la tâche XSLT de la fourmi.

Dans votre fichier web.xml, si vous avez des balises pour spécifier le début et la fin de la fusion, l'indicateur addWebXmlMappings générera le fichier correctement pour vous. Les tags sont: <! - Les mappages de servlets JSPC commencent - > et <! - Les mappages de servlets JSPC se terminent - > après avoir fait cela à mon web.xml tout a fonctionné comme un charme! (Je dois regarder le code de org.apcahe.jasper.JspC pour voir comment cela a été implémenté)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top