Как объединить предварительно скомпилированный фрагмент jsp web.xml с основным web.xml с помощью Ant - PullRequest
5 голосов
/ 02 октября 2008

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

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

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

Ответы [ 5 ]

4 голосов
/ 05 октября 2008

Я использую Задачи 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 в ваш оригинал.

4 голосов
/ 07 октября 2009

Поскольку сгенерированный фрагмент не является допустимым 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=" --&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 без фильтрации.

4 голосов
/ 02 октября 2008

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

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

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

1 голос
/ 30 июня 2010

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

1 голос
/ 07 декабря 2009

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

Одним из них является задача webxmlmerge ant для кактуса, в которой используется org.codehaus.cargo.module.webapp.WebXmlMerger

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

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

...