Java 如何使用Ant将jsp预编译的web.xml片段与主web.xml合并
我们的web应用程序通常使用web.xml,其中包括一些jsp和jsp标记文件。我想切换到使用预编译的jsp。我在build ok中进行了预编译,它生成了web.xml片段,现在我想将该片段合并到主web.xml中 对于web.xml是否有一个include类型指令,允许我包含片段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
理想情况下,我会让开发人员保持原样,因为动态更改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=" --> ${generated.web.xml.fragment} <!-- "
/>
</filterset>
</copy>