2008-10-02 6 views
5

Wir haben die üblichen web.xml für unsere Web-Anwendung, die einige JSP und JSP-Tag-Dateien enthält. Ich möchte zur Verwendung von vorkompilierten JSPs wechseln. Ich habe die Vorkompilierung im Build ok, und es generiert das web.xml Fragment und jetzt möchte ich das Fragment in die Haupt web.xml zusammenführen.Wie jsp vorkompilierte web.xml-Fragment mit Haupt-web.xml mit Ant zusammenfügen

Gibt es eine Art Richtlinie für web.xml enthalten, die mir das Fragment umfassen lassen.

Idealerweise lasse ich die Dinge wie für DEV- als nützlich, um jsp's im laufenden Betrieb zu ändern und die Änderungen sofort zu sehen, aber dann für UAT/PROD, die jsp's werden vorkompiliert und arbeiten somit schneller.

Antwort

4

Ich verwende die Tomcat jasper ANT tasks in meinem Projekt, die die JSPs in Servlets vorkompilieren und die neuen Servlet-Zuordnungen der ursprünglichen web.xml hinzufügen. In den DEV-Builds überspringen Sie einfach diesen Schritt und stellen die JSPs bereit, ohne die web.xml vorkompilieren und ändern zu müssen.

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

Wenn Sie bereits die JSP-Kompilierung Arbeits haben und wollen nur die web.xml-Dateien verschmelzen, ein einfaches XSLT geschrieben werden ausgewählte Elemente (wie die Servletzuordnungen) aus dem neu generierten Web hinzuzufügen, xml in dein Original.

4

Doh - gibt es eine Option auf der jasper2 Aufgabe, um das Fragment in die Haupt web.xml Auto-fusionieren - 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" /> 

Ich frage mich, wie gut die Zusammenführung ist ...

Ärgerlich müssen Sie das Fragment noch generieren, obwohl es nach dieser Aufgabe nicht benötigt wird.

+0

Gut, dass ich scrollte, das war genau das, was ich suchte. OP sollte erwägen, die akzeptierte Antwort zu ändern. Um Ihre Frage zu beantworten, war die Zusammenführung in meinem Fall sauber. Fügt alles zwischen sauberen '' Kommentare ein. –

4

Da das generierte Fragment keine gültige XML-Datei ist (es handelt sich um ein Fragment), kann XSLT nicht direkt verwendet werden. Auf der anderen Seite müssen Sie nicht. Hier ist ein einfacher Trick, der Ihnen genau das gibt, was Sie brauchen.

Fügen Sie in Ihrer web.xml-Datei XML-Kommentar <!-- @[email protected] --> zwischen <servlet> und <servlet-mapping> Elemente ein, z.

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

Dann mit einem Token-Filter @[email protected]-Tag mit erzeugten Inhalt zu ersetzen.

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

Dieser Ansatz hat den Vorteil, dass die ursprüngliche Datei web.xml vollständig gültig ist (ein Tag in dem Kommentar ausgeblendet), sondern gibt Ihnen die totale Kontrolle über wann und wo das erzeugte Fragment eingefügt wird.

Also für DEV Build, kopieren Sie einfach ${orig-web-content.dir}/WEB-INF/web.xml zu ${generated-web-content.dir}/WEB-INF/web.xml ohne Filterung.

1

Es gibt die jasper2 ant Aufgabe, die andere bemerkt haben. Ich dachte, ich würde ein paar andere Optionen erwähnen, die ich gefunden habe.

Eins ist Kaktus 'webxmlmerge ant Aufgabe, die org.codehaus.cargo.module.webapp verwendet.WebXmlMerger

Eine andere wäre JAXB zu verwenden, um die web.xml zu manipulieren; Sebastien Dionnes dtd-schemas-generator Demo macht dies. Nicht sicher, was die Lizenz ist.

fwiw diese Optionen in Betracht gezogen habe ich denke, ich werde die ant XSLT Aufgabe verwenden.

1

Wenn Sie in Ihrer Datei "web.xml" festlegen, wo die Zusammenführung beginnt und endet, generiert das Flag addWebXmlMappings die Datei korrekt für Sie. Die Tags sind: <! - JSPC Servlet Mappings Start -> und <! - JSPC Servlet Mappings Ende -> nach dies auf meine web.xml alles funktioniert wie ein Charme! (Ich muss auf den Code für org.apcahe.jasper.JspC schauen, um zu sehen, wie das implementiert wurde)

+0

Die Tags sind ... was? –