I was able to get this task complete using the ANT build approach as documented here on Dev Shed and referenced here on Stack Overflow.
What was required to get this working was adding failonerror="false" to the javac task as shown here:
<!-- start snip from build.xml from DevShed -->
<target name="generate-jsp-java-src">
<mkdir dir="${webapp.dir}/WEB-INF/jspc-src/${jspc.dir.prefix}"/>
<taskdef classname="org.apache.jasper.JspC" name="jasper2">
<classpath>
<path refid="jspc.classpath"/>
</classpath>
</taskdef>
<touch file="${webapp.dir}/WEB-INF/jspc-web.xml"/>
<jasper2 uriroot="${webapp.dir}"
package="${jspc.pkg.prefix}"
webXmlFragment="${webapp.dir}/WEB-INF/jspc-web.xml"
outputDir="${webapp.dir}/WEB-INF/jspc-src/${jspc.dir.prefix}"
verbose="0"
failonerror="false"
listerrors="true"/>
</target>
<!-- end snip from build.xml from DevShed -->
I also found that setting verbose="0" and listerrors="true" does a better job in showing just the compilation / build errors and getting less un-needed logging.
Additional handy note that I learned from this exercise is that ANT will automatically try to reflect setter methods based on the javac attributes in your task. If Ant finds matching the signature, it will execute this setter method. For example failonerror will reflect to setFailOnError(boolean) by ANT. Thus, if you want to see what other parameters are available, you can simply open JspC.java and see what public setters are available and give them a go by removing "get" and putting as lower case (for consistency sake).
I suspect that this ANT setter reflection is consistent across other Java based tasks.