Как объединить предварительно скомпилированный фрагмент jsp web.xml с основным web.xml с помощью Ant
Вопрос
У нас есть обычное web.xml для нашего веб-приложения, которое включает некоторые файлы тегов jsp и jsp. Я хочу перейти на использование предварительно скомпилированных JSP. У меня есть предварительная компиляция в сборке, и она генерирует фрагмент web.xml, и теперь я хочу объединить этот фрагмент с основным web.xml.
Существует ли директива типа include для web.xml , которая позволяет мне включать фрагмент. Р>
В идеале я оставлю все как есть для DEV, так как полезно менять jsp на лету и сразу видеть изменения, но затем для UAT / PROD jsp будет предварительно скомпилирован и, следовательно, будет работать быстрее.
Решение
Я использую задачи Tomcat jasper ANT в своих проект, который прекомпилирует 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 в ваш оригинал. р>
Другие советы
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" />
Интересно, насколько хорошо это слияние ...
К сожалению, вам нужно сгенерировать фрагмент еще, хотя он не нужен после этой задачи.
Поскольку сгенерированный фрагмент не является допустимым XML-файлом (в конце концов, это фрагмент), невозможно использовать XSLT напрямую. С другой стороны, вам не нужно. Вот простой трюк, который даст вам именно то, что вам нужно.
В своем файле web.xml вставьте XML-комментарий <!-- @JSPS_MAP@ -->
между элементами <servlet>
и <servlet-mapping>
, например
<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>
Затем воспользуйтесь фильтром токенов, чтобы заменить тег @JSPS_MAP@
созданным содержимым.
<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=" --> ${generated.web.xml.fragment} <!-- "
/>
</filterset>
</copy>
Преимущество этого подхода заключается в том, что исходный файл web.xml является полностью допустимым (тег скрыт в комментарии), но дает вам полный контроль над тем, где и когда будет сгенерирован фрагмент.
Так что для сборки DEV просто скопируйте ${orig-web-content.dir}/WEB-INF/web.xml
в ${generated-web-content.dir}/WEB-INF/web.xml
без фильтрации.
Есть jasper2 муравьиная задача, которую заметили другие. Я думал, что упомяну пару других вариантов, которые я нашел.
Одна из них - это задача webxmlmerge , которая использует org.codehaus.cargo.module.webapp.WebXmlMerger
Другой вариант - использовать JAXB для манипулирования web.xml; dtd-schemas-generator Себастьена Дионна делает это , Не уверен, что это за лицензия.
После рассмотрения этих вариантов, я думаю, что я собираюсь использовать задание ant XSLT .
Если в вашем файле web.xml есть теги, указывающие, где начинается и заканчивается слияние, то флаг addWebXmlMappings сгенерирует файл для вас правильно. Теги: <! - Запуск отображений сервлета JSPC - > а также <! - конец отображений сервлета JSPC - > после этого в моем web.xml все заработало как шарм! (Я должен посмотреть на код для org.apcahe.jasper.JspC, чтобы увидеть, как это было реализовано)