tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Steph Richardson" <st...@kvasar.com>
Subject RE: Jasper, JSPC, Ant and Precompiling JSP's
Date Thu, 10 Jul 2003 02:35:55 GMT
Mark,

On compiling the _jsp.java files - yes I had to use <foreach> . And then because <javac>
works recursively on whatever directory you
point it at ( now that every file is in the same package ), I had  to move the contents of
each dir to a tempdir, compile the
tempdir, move classfiles back. Full ( and long ) example below :

Steph

	<!-- Translate and compile all jsp files for current web app -->
	<target name="jspc" depends="tomcat-setworkdir,jspc_preparse">
		<foreach target="jspc_compile" param="param.jspdir" >
			<path>
				<dirset dir="${webapp.workdir}">
				</dirset>
			</path>
		</foreach>
	</target>



	<!-- Use Jasper2 to parse jsp into java -->
	<target name="jspc_preparse" description="Use Jasper2 to parse jsp into java">
		<mkdir dir="${webapp.workdir}"/>

		<jspc
			srcdir="${rootdir}"
		    destdir="${webapp.workdir}"
		    failonerror="false"
			classpathref="jspc_parse.classpath"
		    package="org.apache.jsp"
		    compiler="jasper41">

			<exclude name="**/WEB-INF/**"/>
			<exclude name="include/**"/>
		</jspc>

		<!-- Fix all the package names -->
		<replaceregexp
			match="^package org.apache.jsp.*;"
			replace="package org.apache.jsp;" >
			<fileset dir="${webapp.workdir}" >
				<include name="**/*.java" />
			</fileset>
		</replaceregexp>

	</target>


	<target name="jspc_compile" description="Compiling _jsp.java files for one tomcat directory">
		<echo message="jspc_compile called for ${param.jspdir}" />

		<property name="tempbuild" value="${rootdir}/WEB-INF/temp/src" />

		<mkdir dir="${tempbuild}" />
		<copy todir="${tempbuild}" >
			<fileset dir="${param.jspdir}" >
				<include name="*.java" />
			</fileset>
		</copy>

	    <javac srcdir="${tempbuild}"
			destdir="${tempbuild}"
	        optimize="off"
	        debug="on"
	        failonerror="true">

	      <classpath>
	        <path refid="build.classpath" />
	        <pathelement location="${tomcat.home}/common/classes"/>
	        <fileset dir="${tomcat.home}/common/lib">
	          <include name="*.jar"/>
	        </fileset>
	        <pathelement location="${tomcat.home}/shared/classes"/>
	        <fileset dir="${tomcat.home}/shared/lib">
	          <include name="*.jar"/>
	        </fileset>
	      </classpath>
	    </javac>

		<available property="package.created" file="${tempbuild}/org/apache/jsp" />

		<!-- If no jsp / java files in this dir, then skip move because it would fail -->
		<if>
			<istrue value="${package.created}" />
			<then>
				<move todir="${param.jspdir}">
					<fileset dir="${tempbuild}/org/apache/jsp" />
				</move>
			</then>
			<else>
				<echo message="No java files to compile in ${param.jspdir}" />
			</else>
		</if>

		<delete dir="${tempbuild}" quiet="true"/>
	</target>










> -----Original Message-----
> From: Mark R. Diggory [mailto:mdiggory@latte.harvard.edu]
> Sent: Tuesday, August 05, 2003 10:02 PM
> To: Tomcat Users List
> Subject: Re: Jasper, JSPC, Ant and Precompiling JSP's
>
>
> Ah, o.k. I had misunderstood what that attribute was for in the Ant
> Manual. I will try it and verify if the packaging comes out right.
>
> If I understand correctly, I will still need to walk the directories
> with the forEach task to get them compiled to classes, is this correct?
>
> thanks again for the help,
> -Mark
>
> Steph Richardson wrote:
> > Mark,
> >
> > The jspc task that I used from the standard "Optional Tasks" that come with ant,
does support a webapp parameter, and this works
> > fine to compile the whole webapp without any regexp voodoo ( I didn't use it because
it won't allow you to exclude any files ).
> >
> > I did see once a conversation on the ant-dev list that complained about how brittle
the jspc task has been to maintain.
> >
> > So jasper ( with 4.1.28 ) comes with it's own built in task to completely compile
a webapp. As described here :
> > http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jasper-howto.html#Web%20Application%20Compilation
> >
> > If you ignore the part about the web.xml fragment, and make sure your output dir
is the same as your Tomcat workdir,
> then this works
> > too ( I think - I did so many experiments my mind is now cloudy ).
> >
> > Steph
> >
> >
> >
> >
> >>-----Original Message-----
> >>From: Mark R. Diggory [mailto:mdiggory@latte.harvard.edu]
> >>Sent: Monday, August 04, 2003 5:05 PM
> >>To: Tomcat Users List
> >>Subject: Re: Jasper, JSPC, Ant and Precompiling JSP's
> >>
> >>
> >>Bingo! Thats pretty tight. I hadn't thought of using regexp, but I'll
> >>give this a try, it seems pretty logical. I didn't realize someone had
> >>contributed a forEach task.
> >>
> >>I'd still like to hear about if theres any work ongoing in relation to
> >>JspC and precompilation of entire webapplications in Tomcat?
> >>
> >>thanks again,
> >>Mark
> >>
> >>
> >>Steph Richardson wrote:
> >>
> >>
> >>>Mark,
> >>>
> >>>I have a working solution for pre-compiling jsp, that I am using successfully
with all our tomcat installations. The
> >>
> >>target looks
> >>
> >>>like :
> >>>
> >>>	<target name="jspc_preparse" description="Use Jasper2 to parse jsp into
java">
> >>>		<mkdir dir="${webapp.workdir}"/>
> >>>
> >>>		<jspc
> >>>		    srcdir="${webapp.rootdir}"
> >>>		    destdir="${webapp.workdir}"
> >>>		    failonerror="false"
> >>>		    classpathref="jspc_parse.classpath"
> >>>		    package="org.apache.jsp"
> >>>		    compiler="jasper41">
> >>>
> >>>			<exclude name="**/WEB-INF/**"/>
> >>>			<exclude name="include/**"/>
> >>>		</jspc>
> >>>
> >>>		<!-- Fix all the package names -->
> >>>		<replaceregexp
> >>>			match="^package org.apache.jsp.*;"
> >>>			replace="package org.apache.jsp;" >
> >>>			<fileset dir="${webapp.workdir}" >
> >>>				<include name="**/*.java" />
> >>>			</fileset>
> >>>		</replaceregexp>
> >>>
> >>>	</target>
> >>>
> >>>
> >>>
> >>>I then use <foreach> from antcontrib to iterate over the directories
and compile them individually.
> >>>Tomcat seems to accept all the resulting class files at runtime with no problems.
> >>>
> >>>Regards,
> >>>
> >>>Steph
> >>>
> >>>
> >>>
> >>>
> >>>>-----Original Message-----
> >>>>From: Steph Richardson [mailto:steph@kvasar.com]
> >>>>Sent: Friday, August 01, 2003 7:06 PM
> >>>>To: Tomcat Users List
> >>>>Subject: RE: Jasper, JSPC, Ant and Precompiling JSP's
> >>>>
> >>>>
> >>>>
> >>>>That is EXACTLY what I am trying to do today. I've tooled around in the
ant code, and it seems this is more of a jasper
> >>
> >>issue than
> >>
> >>>>an ant one, because ant passes a long list of files to jasper, with the
unwanted pathnames that end up as part of your
> >>>>package name.
> >>>>
> >>>>I'm pretty sure if you used something like <foreach> to iterate
through the same fileset that is being created in the
> >>>>jspc task, and
> >>>>called jspc for each directory individually, and used the package="org.apache.jsp"
attribute, then this would work -
> >>
> >>because then
> >>
> >>>>jasper wouldn't know about you're own subdirectory. But this seems ugly
so I haven't actually done it yet.
> >>>>
> >>>>You can use the webapp element inside jspc, but then jasper doesn't know
about your <exclude> and so tries to compile some
> >>>>fragment.jsp type include files, that are not really full jsp files,
and so it crashes on those ( this is my current
> >>>>problem ). But
> >>>>if all your included files are called .inc rather than .jsp then this
may work.
> >>>><jspc
> >>>>      destdir="${webapp.workdir}"
> >>>>      failonerror="false"
> >>>>      classpathref="jspPreCompile.classpath"
> >>>>      package="org.apache.jsp"
> >>>>      compiler="jasper41">
> >>>>	 <webapp basedir="${webapp.path}"/>
> >>>>    <exclude name="**/WEB-INF/**"/>
> >>>>    <exclude name="include/**"/>
> >>>></jspc>
> >>>>
> >>>>
> >>>>So now I'm trying to make an ant step or task to replace the first line
of every generated _jsp.java file with the
> >>
> >>correct package
> >>
> >>>>name, between generating them and compiling them.
> >>>>Plz met me know if you have something better.
> >>>>
> >>>>
> >>>>Regards,
> >>>>
> >>>>Steph
> >>>>
> >>>>
> >>>>PS - if you're from the same HMDC i know, I suspect the site you are
trying to pre-compile, is one I wrote last summer.
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>>-----Original Message-----
> >>>>>From: Mark R. Diggory [mailto:mdiggory@latte.harvard.edu]
> >>>>>Sent: Friday, August 01, 2003 5:19 PM
> >>>>>To: Tomcat Users List
> >>>>>Subject: Jasper, JSPC, Ant and Precompiling JSP's
> >>>>>
> >>>>>
> >>>>>Hello,
> >>>>>
> >>>>>I've done my best to review the archives to resolve my problem, but
I've
> >>>>>not found a solution there so I'm posting it.
> >>>>>
> >>>>>I'm stuck back on Tomcat 4.1.24 (LE) and I'm encountering some issues
> >>>>>with JSP Precompilation using Ant and JSPC. First let me outline
my problem.
> >>>>>
> >>>>>Most messages I've read to date focus on using JSP recompiling to
turn
> >>>>>the JSP into Servlets stored in a WAR file and require generating
a
> >>>>>fragment web.xml file and including it into your web.xml, I AM NOT
> >>>>>trying to do this. I want my JSP's to get precompiled into the work
> >>>>>directory of Tomcat and used from there, the exact same way that
Tomcat
> >>>>>does it. This way afterward, if the jsp is modified, tomcat can still
> >>>>>recompile it.
> >>>>>
> >>>>>
> >>>>>I have the following jspc and javac tasks coded in my build.xml:
> >>>>>
> >>>>><mkdir dir="/var/tomcat4/work/Standalone/localhost/Foo"/>
> >>>>>
> >>>>><jspc srcdir="${deploy.home}"
> >>>>>      destdir="/var/tomcat4/work/Standalone/localhost/Foo"
> >>>>>      failonerror="false"
> >>>>>      compiler="jasper41">
> >>>>>    <classpath>
> >>>>>        <!-- snip -->
> >>>>>    </classpath>
> >>>>>    <exclude name="**/WEB-INF/**"/>
> >>>>></jspc>
> >>>>>
> >>>>><javac destdir="/var/tomcat4/work/Standalone/localhost/Foo"
> >>>>>       optimize="off"
> >>>>>       debug="on" failonerror="false"
> >>>>>       srcdir="/var/tomcat4/work/Standalone/localhost/Foo"
> >>>>>       excludes="**/*.smap">
> >>>>>     <classpath>
> >>>>>        <!-- snip -->
> >>>>>     </classpath>
> >>>>></javac>
> >>>>>
> >>>>>
> >>>>>Both tasks get completed successfully. I observe problems in the
package
> >>>>>names of the JSPC generated java files where the following is the
case.
> >>>>>
> >>>>>/var/tomcat/webapps/Foo/Bar/Bam.jsp results in the package name
> >>>>>
> >>>>>package Bar;
> >>>>>...
> >>>>>
> >>>>>which becomes a problem when I try to access this JSP included into
> >>>>>another, I get the following error
> >>>>>
> >>>>>java.lang.NoClassDefFoundError: org/apache/jsp/Bam_jsp (wrong name:
> >>>>>Bar/Bam_jsp)
> >>>>>	at java.lang.ClassLoader.defineClass0(Native Method)
> >>>>>	at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
> >>>>>	at java.lang.ClassLoader.defineClass(ClassLoader.java:431)
> >>>>>	at org.apache.jasper.servlet.JasperLoader.loadClass(Unknown Source)
> >>>>>	at org.apache.jasper.servlet.JasperLoader.loadClass(Unknown Source)
> >>>>>	at org.apache.jasper.JspCompilationContext.load(Unknown Source)
> >>>>>	at org.apache.jasper.servlet.JspServletWrapper.getServlet(Unknown
Source)
> >>>>>	at org.apache.jasper.compiler.Compiler.isOutDated(Unknown Source)
> >>>>>	at org.apache.jasper.compiler.Compiler.isOutDated(Unknown Source)
> >>>>>	...
> >>>>>
> >>>>>
> >>>>>I read somewhere that work had been done on my version (4.1.24) to
> >>>>>eliminate a naming conflict problem. I assume this is why there are
now
> >>>>>package names on my _jsp.java files.  I find that when I let
> >>>>>Tomcat/Jasper compile all my jsp's the java files *all* have the
package
> >>>>>name "org.apache.jsp" no matter what their directory. I assume that
my
> >>>>>compilation is conflicting with Tomcats because of the package naming
> >>>>>differences.
> >>>>>
> >>>>>So, I've tried adding the following attribute package="org.apache.jsp"
> >>>>>to the jspc task, but this results in even more problems because
all the
> >>>>>package names now look like:
> >>>>>
> >>>>>package org.apache.jsp.Bar;
> >>>>>
> >>>>>and when they are compiled, they end up in a separate directory
> >>>>>
> >>>>>/var/tomcat4/work/Foo/org/apache/jsp/Bar/Bam_jsp.java
> >>>>>
> >>>>>Any ideas or solutions out there would be really helpful for me.
I just
> >>>>>want to have Tomcat start out using my precompiled jsp's instead
of
> >>>>>initially compiling them itself.
> >>>>>
> >>>>>thanks
> >>>>>Mark Diggory
> >>>>>HMDC
> >>>>>
> >>>>>
> >>>>>---------------------------------------------------------------------
> >>>>>To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> >>>>>For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>>>---------------------------------------------------------------------
> >>>>To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> >>>>For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>>
> >>>---------------------------------------------------------------------
> >>>To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> >>>For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> >>>
> >>
> >>
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> >>For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> >>
> >>
> >>
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
>
>
>


Mime
View raw message