2008-10-02 3 views
5

У нас есть обычный web.xml для нашего веб-приложения, которое содержит некоторые файлы тегов jsp и jsp. Я хочу переключиться на использование предварительно скомпилированных jsp. У меня есть предварительная компиляция, происходящая в сборке ok, и она генерирует фрагмент web.xml, и теперь я хочу объединить фрагмент в основной web.xml.Как слить jsp предварительно скомпилированный фрагмент web.xml с основным web.xml с помощью Ant

Есть ли включать типа директиву web.xml, что позволит мне включать фрагмент.

В идеале я оставляю вещи, как для DEV, так как полезно изменить jsp на лету и сразу увидеть изменения, но затем для UAT/PROD, jsp будет предварительно скомпилирован и, таким образом, будет работать быстрее.

ответ

4

В моем проекте используется Tomcat jasper ANT tasks, который предварительно скомпилирует JSP в сервлеты и добавит новые сопоставления сервлета в исходный web.xml. В сборках DEV просто пропустите этот шаг и разверните JSP без предварительной компиляции и модификации 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> 

Если у вас уже есть компиляции JSP работать и просто хотите, чтобы объединить файлы web.xml, простой XSLT может быть написано, чтобы добавить выбранные элементы (такие как отображения сервлет) из вновь образованного полотна, XML в ваш оригинал.

4

Doh - есть вариант на jasper2 задачи для автоустановки фрагмента в основной 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" /> 

Интересно, насколько хорошо слияние ...

Раздражающе вам нужно сгенерировать фрагмент, даже если он не нужен после этой задачи.

+0

Хорошо, что я прокрутил вниз, это именно то, что я искал. OP должен рассмотреть вопрос об изменении принятого ответа. Чтобы ответить на ваш вопрос, слияние было чисто в моем случае. Делает все между аккуратными сопоставлениями сервлетов ``. – 2013-12-17 14:14:21

4

Поскольку сгенерированный фрагмент не является допустимым XML-файлом (это, в конце концов, фрагмент), использовать XSLT напрямую невозможно. С другой стороны, вам это не нужно. Вот простой трюк, который даст вам именно то, что вам нужно.

В файле вашего web.xml вставить XML-комментарий <!-- @[email protected] --> между <servlet> и <servlet-mapping> элементами, например.

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

Затем с помощью маркеров фильтра для замены @[email protected] тега генерируемого содержимого.

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

Этот подход имеет то преимущество, что исходный файл web.xml является полностью действительным (тег скрыт в комментарии), но дает вам полный контроль, где и когда полученный фрагмент будет вставлен.

Для создания DEV просто скопируйте ${orig-web-content.dir}/WEB-INF/web.xml в ${generated-web-content.dir}/WEB-INF/web.xml без фильтрации.

1

Существует jasper2 ant task другие отметили. Я думал, что упомянул еще пару других вариантов, которые я нашел.

One is cactus webxmlmerge ant task, который использует org.codehaus.cargo.module.webapp.WebXmlMerger

Другим было бы использование JAXB для управления web.xml; Демо-версия Sebastien Dionne's dtd-schemas-generator делает это. Не уверен, что такое лицензия.

fwiw, рассмотрев эти варианты, я думаю, что собираюсь использовать муравь XSLT задача.

1

В вашем файле web.xml, если у вас есть теги, чтобы указать, где начинается и заканчивается слияние, флаг addWebXmlMappings будет генерировать файл правильно для вас. Теги: <! - начало отображения сервлетов JSPC -> и <! - Отображение сервлетов JSPC -> после этого в моем web.xml все работает как шарм! (Я должен посмотреть на код для org.apcahe.jasper.JspC, чтобы посмотреть, как это было реализовано)

+0

Теги ... что? – 2011-06-02 13:44:47

Смежные вопросы