You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@geronimo.apache.org by Łukasz Budnik <lu...@gmail.com> on 2008/04/05 15:24:37 UTC

[Solution] Ant and pre-compiled JSPs

Hi All,

If you use Ant to build your project you can use described below
solution to pre-compile JSPs.

It's extremely useful when you use complex JSP pages, for example
pages with MyFaces + Tomahawk + Tomahawk Sandbox load much faster!

First of all, you cannot use standard JspC task as described here:
http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/jasper/JspC.html

You need to set
org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS to true
which is simply impossible at the taskdef level.

In order to set this property and pass it to some other Java class you
need to use <java> task with nested <sysproperty>.

First of all the classpath:

<path id="jspc-classpath">
         <!-- taglib jsp core -->
         <pathelement
location="${GERONIMO_HOME}\repository\jstl\jstl\1.2\jstl-1.2.jar" />
         <!-- taglib jsf core and html -->
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\myfaces\core\myfaces-impl\1.2.2\myfaces-impl-1.2.2.jar"/>
         <!-- taglib tomahawk -->
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\myfaces\tomahawk\tomahawk\1.1.7-SNAPSHOT\tomahawk-1.1.7-SNAPSHOT.jar"
/>
         <!-- taglib tomahawk sandbox -->
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\myfaces\tomahawk\tomahawk-sandbox\1.1.7-SNAPSHOT\tomahawk-sandbox-1.1.7-SNAPSHOT.jar"
/>
         <!-- Geronimo's jasper -->
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\tomcat\jasper\6.0.14-G614585\jasper-6.0.14-G614585.jar"
/>
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\tomcat\jasper-el\6.0.14\jasper-el-6.0.14.jar"
/>
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\geronimo\specs\geronimo-jsp_2.1_spec\1.0.1\geronimo-jsp_2.1_spec-1.0.1.jar"
/>
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\geronimo\specs\geronimo-el_1.0_spec\1.0.1\geronimo-el_1.0_spec-1.0.1.jar"
/>
         <!-- required by Jasper -->
         <pathelement
location="${GERONIMO_HOME}\repository\org\apache\tomcat\juli\6.0.14\juli-6.0.14.jar"
/>
         <!-- if your web app uses some other libs, add it here -->
         <path refid="web-classpath" />
         <!-- JspC is also implemented as Ant Task - it needs Ant lib
when run as a Java class -->
         <pathelement location="${ant.home}\lib\ant.jar "/>
</path>

Now, use this target to compile JSP to servlets:

<target name="jspc">
		<!-- must use fork! otherwise there will be ClasCastException -
AntClassLoader cannot be casted to URLClassLoader! -->
		<java classname="org.apache.jasper.JspC" fork="true">
		  <classpath refid="jspc-classpath"/>
                  <!-- the key feature ;) -->
		  <sysproperty
key="org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS"
value="true"/>
		  <arg value="-p"/>
		  <arg value="org.xh.nuntius.web.jsps"/>
		  <arg value="-webapp"/>
		  <arg value="${web-build}/classes"/>
		  <arg value="-webinc"/>
		  <arg value="${web-build}/classes/WEB-INF/generated_web.xml"/>
		  <arg value="-d"/>
		  <arg value="${web-build}/classes/WEB-INF/src"/>
		  <arg value="-source"/>
		  <arg value="1.5"/>
		  <arg value="-target"/>
		  <arg value="1.5"/>
		  <arg value="-s"/>
		</java>
	</target>

Now compile generated servlets to byte codes:

<target name="jspc-compile" depends="jspc">
		<javac srcdir="${web-build}/classes/WEB-INF/src"
destdir="${web-build}/classes/WEB-INF/classes"
classpathref="jspc-classpath" encoding="UTF-8" />
</target>

Note that before packaging your application the generated_web.xml must
be merged with your original web.xml.

And my suggestion:

If Geronimo team is using very own, enhanced Jasper version why not
assume that USE_INSTANCE_MANAGER_FOR_TAGS is always set to true?

It would be much easier for us all ;)

best regards
Łukasz

Re: [Solution] Ant and pre-compiled JSPs

Posted by Kevan Miller <ke...@gmail.com>.
On Apr 5, 2008, at 9:24 AM, Łukasz Budnik wrote:

> Hi All,
>
> If you use Ant to build your project you can use described below
> solution to pre-compile JSPs.
>
> It's extremely useful when you use complex JSP pages, for example
> pages with MyFaces + Tomahawk + Tomahawk Sandbox load much faster!
>
> First of all, you cannot use standard JspC task as described here:
> http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/jasper/ 
> JspC.html
>
> You need to set
> org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS to true
> which is simply impossible at the taskdef level.
>
> In order to set this property and pass it to some other Java class you
> need to use <java> task with nested <sysproperty>.
>
> First of all the classpath:
>
> <path id="jspc-classpath">
>         <!-- taglib jsp core -->
>         <pathelement
> location="${GERONIMO_HOME}\repository\jstl\jstl\1.2\jstl-1.2.jar" />
>         <!-- taglib jsf core and html -->
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\myfaces\core 
> \myfaces-impl\1.2.2\myfaces-impl-1.2.2.jar"/>
>         <!-- taglib tomahawk -->
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\myfaces\tomahawk 
> \tomahawk\1.1.7-SNAPSHOT\tomahawk-1.1.7-SNAPSHOT.jar"
> />
>         <!-- taglib tomahawk sandbox -->
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\myfaces\tomahawk 
> \tomahawk-sandbox\1.1.7-SNAPSHOT\tomahawk-sandbox-1.1.7-SNAPSHOT.jar"
> />
>         <!-- Geronimo's jasper -->
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\tomcat\jasper 
> \6.0.14-G614585\jasper-6.0.14-G614585.jar"
> />
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\tomcat\jasper-el 
> \6.0.14\jasper-el-6.0.14.jar"
> />
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\geronimo\specs 
> \geronimo-jsp_2.1_spec\1.0.1\geronimo-jsp_2.1_spec-1.0.1.jar"
> />
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\geronimo\specs 
> \geronimo-el_1.0_spec\1.0.1\geronimo-el_1.0_spec-1.0.1.jar"
> />
>         <!-- required by Jasper -->
>         <pathelement
> location="${GERONIMO_HOME}\repository\org\apache\tomcat\juli 
> \6.0.14\juli-6.0.14.jar"
> />
>         <!-- if your web app uses some other libs, add it here -->
>         <path refid="web-classpath" />
>         <!-- JspC is also implemented as Ant Task - it needs Ant lib
> when run as a Java class -->
>         <pathelement location="${ant.home}\lib\ant.jar "/>
> </path>
>
> Now, use this target to compile JSP to servlets:
>
> <target name="jspc">
> 		<!-- must use fork! otherwise there will be ClasCastException -
> AntClassLoader cannot be casted to URLClassLoader! -->
> 		<java classname="org.apache.jasper.JspC" fork="true">
> 		  <classpath refid="jspc-classpath"/>
>                  <!-- the key feature ;) -->
> 		  <sysproperty
> key="org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS"
> value="true"/>
> 		  <arg value="-p"/>
> 		  <arg value="org.xh.nuntius.web.jsps"/>
> 		  <arg value="-webapp"/>
> 		  <arg value="${web-build}/classes"/>
> 		  <arg value="-webinc"/>
> 		  <arg value="${web-build}/classes/WEB-INF/generated_web.xml"/>
> 		  <arg value="-d"/>
> 		  <arg value="${web-build}/classes/WEB-INF/src"/>
> 		  <arg value="-source"/>
> 		  <arg value="1.5"/>
> 		  <arg value="-target"/>
> 		  <arg value="1.5"/>
> 		  <arg value="-s"/>
> 		</java>
> 	</target>
>
> Now compile generated servlets to byte codes:
>
> <target name="jspc-compile" depends="jspc">
> 		<javac srcdir="${web-build}/classes/WEB-INF/src"
> destdir="${web-build}/classes/WEB-INF/classes"
> classpathref="jspc-classpath" encoding="UTF-8" />
> </target>
>
> Note that before packaging your application the generated_web.xml must
> be merged with your original web.xml.
>
> And my suggestion:
>
> If Geronimo team is using very own, enhanced Jasper version why not
> assume that USE_INSTANCE_MANAGER_FOR_TAGS is always set to true?
>
> It would be much easier for us all ;)

Thanks Lukasz! Agreed we should make this easier...

--kevan