병합하는 방법 jsp pre-compiled web.xml 조각과 주요 web.xml 를 사용하여 개미
문제
우리가 평소 web.xml 우리의 웹 응용 프로그램 일부를 포함 jsp 및 jsp 태그 파일이 있습니다.고 싶은 스위치를 사용하여 미리 컴파일 jsp 습니다.내가 미리 컴파일에서 일어나는 구축하고 확인,생성 web.xml 조각은 이제 내가 병합하려는 조각으로 주요 web.xml.
이 함 type 지시어에 대한 web.xml 그런스를 유지하도록 도와드립니다.이 포함됩니다.
상을 떠나 있는 것 같은 개발-로를 변경하는 것이 유용 jsp 의 즉시 즉시 변경 사항을만한 다음에 대한 UAT/PROD,jsp 의 미리 컴파일하고 따라서 작업 속도가 빨라질 수 있습니다.
해결책
나는 그것을 사용한다 Tomcat Jasper Ant 작업 내 프로젝트에서는 JSP를 서블릿으로 사전 컴파일하고 새로운 서블릿 매핑을 원래 Web.xml에 추가합니다. Dev 빌드에서는이 단계를 건너 뛰고 Web.xml의 사전 컴파일 및 수정없이 JSP를 배포하십시오.
<?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 파일을 병합하려면 새로 생성 된 웹에서 XML에서 선택한 요소 (예 : 서블릿 매핑)를 원본으로 추가하기 위해 간단한 XSLT를 작성할 수 있습니다.
다른 팁
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" />
내가 방금은 병합되...
귀찮게 당신을 생성해야 할 조각은 여전히더라도,그 후 필요에 따라 이 작업입니다.
생성 된 조각은 유효한 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=" --> ${generated.web.xml.fragment} <!-- "
/>
</filterset>
</copy>
이 접근법은 원래 web.xml 파일이 완전히 유효하다는 이점이 있지만 (태그는 주석에 숨겨져 있음) 생성 된 조각이 삽입 될 위치와시기를 완전히 제어 할 수 있습니다.
따라서 Dev 빌드의 경우 복사 만하면됩니다 ${orig-web-content.dir}/WEB-INF/web.xml
에게 ${generated-web-content.dir}/WEB-INF/web.xml
필터링없이.
거기에 있습니다 Jasper2 Ant 과제 다른 사람들이 언급했습니다. 내가 찾은 몇 가지 다른 옵션을 언급 할 것이라고 생각했습니다.
하나는 선인장입니다. webxmlmerge org.codehaus.cargo.module.webapp.webxmlmerger를 사용하는 Ant Task
다른 하나는 사용하는 것입니다 JaxB Web.xml을 조작하기 위해; Sebastien Dionne 's DTD-Schemas-Generator 데모는 이것을합니다. 라이센스가 무엇인지 확실하지 않습니다.
fwiw는 이러한 옵션을 고려한 것입니다. xslt 직무.
web.xml 파일에서 합병이 시작되고 끝나는 위치를 지정하여 AddWebXmlMappings 플래그가 파일을 올바르게 생성합니다. 태그는 다음과 같습니다.u003C!-- JSPC servlet mappings start --> 그리고u003C!-- JSPC servlet mappings end --> 내 web.xml 에이 작업을 수행 한 후 모든 것이 매력처럼 작동했습니다! (org.apcahe.jasper.jspc의 코드를 살펴 보려면 이것이 어떻게 구현되었는지 확인해야합니다)