代码之家  ›  专栏  ›  技术社区  ›  Chris Kimpton

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

  •  5
  • Chris Kimpton  · 技术社区  · 17 年前

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

    有没有 的类型指令 这样我就可以把碎片包括进去了。

    理想情况下,我会让开发人员保持原样,因为动态更改jsp很有用,可以立即看到更改,但对于UAT/PROD,jsp将被预编译,因此工作速度更快。

    5 回复  |  直到 17 年前
        1
  •  4
  •   Mads Hansen    17 年前

    我使用 Tomcat jasper ANT tasks 在我的项目中,它将JSP预编译为servlet,并将新的servlet映射添加到原始web.xml。在开发人员构建中,只需跳过这一步,部署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>
    

        2
  •  4
  •   Chris Kimpton    17 年前

    Doh-jasper2任务中有一个选项可以自动将片段合并到主web.xml中-

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

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

        3
  •  4
  •   Alexander Pogrebnyak    16 年前

    因为生成的片段不是有效的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文件完全有效(注释中隐藏了一个标记),但可以完全控制插入生成片段的位置和时间。

    因此,对于开发人员构建,只需复制 ${orig-web-content.dir}/WEB-INF/web.xml ${generated-web-content.dir}/WEB-INF/web.xml 没有过滤。

        4
  •  1
  •   JasonPlutext    16 年前

    有一个 茉莉花

    webxmlmerge ant任务,使用org.codehaus.cargo.module.webapp.webxmlmerge

    另一种方法是使用 操纵web.xml;塞巴斯蒂安·迪翁的 dtd-schemas-generator 演示就是这样做的。但不确定许可证是什么。

    fwiw考虑了这些选项后,我想我将使用ant XSLT

        5
  •  1
  •   Ipkiss Rick Justesen    13 年前

    在web.xml文件中,如果有标记指定合并的开始和结束位置,addWebXmlMappings标志将为您正确生成文件。这些标签是: <!--JSPC servlet映射启动--> 和 <!--JSPC servlet映射结束--> 在对我的web.xml做了这些之后,一切都变得非常有魅力!(我必须查看org.apcahe.jasper.JspC的代码以了解这是如何实现的)

    推荐文章