Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Ant将jsp预编译的web.xml片段与主web.xml合并_Java_Jsp_Tomcat_Ant_Web.xml - Fatal编程技术网

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

Java 如何使用Ant将jsp预编译的web.xml片段与主web.xml合并,java,jsp,tomcat,ant,web.xml,Java,Jsp,Tomcat,Ant,Web.xml,我们的web应用程序通常使用web.xml,其中包括一些jsp和jsp标记文件。我想切换到使用预编译的jsp。我在build ok中进行了预编译,它生成了web.xml片段,现在我想将该片段合并到主web.xml中 对于web.xml是否有一个include类型指令,允许我包含片段 理想情况下,我会让开发人员保持原样,因为动态更改jsp很有用,可以立即看到更改,但对于UAT/PROD,jsp将被预编译,因此工作速度更快。Doh-jasper2任务中有一个选项,可以自动将片段合并到主web.xml

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

对于web.xml是否有一个include类型指令,允许我包含片段


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

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

我想知道合并有多好

令人烦恼的是,您仍然需要生成片段,即使在完成此任务后不需要它。

我在项目中使用了,它将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>


如果您已经进行了JSP编译,并且只想合并web.xml文件,那么可以编写一个简单的XSLT,将新生成的web.xml中的选定元素(例如servlet映射)添加到原始文件中。

因为生成的片段不是有效的xml文件(毕竟是片段),不可能直接使用XSLT。另一方面,你不必这么做。这里有一个简单的技巧,它会给你你所需要的

在web.xml文件中,在
元素之间插入xml注释,例如

  <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>
这种方法的优点是原始web.xml文件完全有效(注释中隐藏了一个标记),但可以完全控制插入生成片段的位置和时间


因此,对于开发构建,只需将
${orig web content.dir}/web-INF/web.xml
复制到
${generated web content.dir}/web-INF/web.xml
,而不进行过滤。

还有其他人注意到的jasper2ant任务。我想我应该提到我发现的其他几个选择

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

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


fwiw考虑了这些选项后,我想我将在web.xml文件中使用antXSLT任务。

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

好消息是,我向下滚动,这正是我想要的。OP应该考虑改变所接受的答案。为了回答你的问题,在我的情况下,合并是干净的。将所有内容放在整洁的
注释之间。
<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>