如何使用Ant将jsp预编译的web.xml片段与主web.xml合并

时间:2008-10-02 12:47:16

标签: java jsp tomcat ant web.xml

我们的Web应用程序通常包含 web.xml ,其中包含一些jsp和jsp标记文件。我想切换到使用预编译的jsp。我在build ok中进行了预编译,它生成了web.xml片段,现在我想将片段合并到主web.xml中。

web.xml 是否有 include 类型指令,可以让我包含该片段。

理想情况下,我会保留DEV的内容,因为它可以立即更改jsp并立即查看更改,但是对于UAT / PROD,jsp将被预编译,因此工作更快。

5 个答案:

答案 0 :(得分: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" />

我想知道合并有多好......

令人讨厌的是,你需要生成片段,即使在完成此任务后不需要它。

答案 1 :(得分:4)

我在项目中使用Tomcat jasper ANT tasks,它将JSP预编译为servlet,并将新的servlet映射添加到原始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来将新生成的web,xml中的选定元素(例如servlet映射)添加到原始文件中。

答案 2 :(得分:4)

因为生成的片段不是有效的XML文件(毕竟它是片段),所以不能直接使用XSLT。另一方面,你没有必要。这是一个简单的技巧,可以满足您的需求。

在您的web.xml文件中,在<!-- @JSPS_MAP@ --><servlet>元素之间插入XML注释<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而不进行过滤。

答案 3 :(得分:1)

其他人已经注意到 jasper2 ant任务。我以为我会提到我发现的其他几个选项。

一个是cactus' webxmlmerge ant任务,它使用org.codehaus.cargo.module.webapp.WebXmlMerger

另一种方法是使用 JAXB 来操作web.xml; Sebastien Dionne的dtd-schemas-generator演示就是这样做的。不知道许可证是什么。

fwiw考虑过这些选项我认为我将使用ant XSLT 任务。

答案 4 :(得分:1)

在您的web.xml文件中,如果您有用于指定合并开始和结束位置的标记,则addWebXmlMappings标志将为您正确生成文件。标签是: &lt;! - JSPC servlet映射开始 - &gt; 和 &lt;! - JSPC servlet映射结束 - &gt; 在对我的web.xml执行此操作后,一切都像一个魅力! (我必须查看org.apcahe.jasper.JspC的代码,看看它是如何实现的)