## jspc

### Deprecated

If you use this task with Tomcat's Jasper JSP compiler, you should seriously consider using the task shipping with Tomcat instead. This task is only tested against Tomcat 4.x. There are known problems with Tomcat 5.x that won't get fixed in Ant, please use Tomcat's `jspc` task instead.
Instead of relying on container-specific JSP compilers we suggest deploying the raw files (`*.jsp`) and use the container build-in functions: after deploying run a test suite (e.g. with Cactus or HttpUnit) against the deployed web application. So you'll get the test result and the compiled JSPs.

### Description

Apache Ant task to run the JSP compiler and turn JSP pages into Java source files.

This task can be used to precompile JSP pages for fast initial invocation of JSP pages, deployment on a server without the full JDK installed, or simply to syntax check the pages without deploying them. In most cases, a `javac` task is usually the next stage in the build process. The task does basic dependency checking to prevent unnecessary recompilation—this checking compares source and destination timestamps, and does not factor in class or taglib dependencies, or `<jsp:include>` references.

By default the task uses the Jasper JSP compiler. This means the task needs `jasper.jar` and `jasper-runtime.jar`, which come with builds of Tomcat 4/Catalina from the Apache Tomcat project, and any other jar files which may be needed in future versions (it changes).

We recommend (in March 2003) Tomcat version 4.1.x for the most robust version of Jasper.

There are many limitations with this task which partially stem from the many versions of Jasper, others from implementation 'issues' in the task (i.e. nobody's willingness to radically change large bits of it to work around Jasper). Because of this and the fact that JSP pages do not have to be portable across implementations—or versions of implementations—this task is better used for validating JSP pages before deployment, rather than precompiling them. For the latter, just deploy and run your HttpUnit JUnit tests after deployment to compile and test your pages, all in one go.

### Parameters

The Task has the following attributes:

Attribute | Description | Required
--- | --- | ---
destdir | Where to place the generated files. They are located under here according to the given package name. | Yes
srcdir | Where to look for source JSP files. | Yes
verbose | The verbosity integer to pass to the compiler. | No; default 0
package | Name of the destination package for generated Java classes. | No
compiler | class name of a JSP compiler adapter, such as jasper or jasper41 | No; defaults to jasper
ieplugin | Java Plugin classid for Internet Explorer. | No
mapped | (boolean) Generate separate `write()` calls for each HTML line in the JSP. | No
classpath | The classpath to use to run the JSP compiler. | No, but it seems to work better when used; can also be specified by the nested element `classpath`
classpathref | A Reference. As per classpath. | No
failonerror | flag to control action on compile failures. | No; default yes
uribase | The context of relative URI references in JSP. | No; derived from the location of the file relative to the declared or derived value of uriroot
uriroot | The root directory that URIs should be resolved against. | No
compiler | Class name of JSP compiler adapter to use. | No; defaults to the standard adapter for Jasper
compilerclasspath | The classpath used to find the compiler adapter specified by the compiler attribute. | No
webinc | Output file name for the fraction of `web.xml` that lists servlets. | No
webxml | File name for `web.xml` to be generated | No

The mapped option will, if set to true, split the JSP text content into a one line per call format. There are comments above and below the mapped write calls to localize where in the JSP file each line of text comes from. This can lead to a minor performance degradation (but it is bound by a linear complexity). Without this option all adjacent writes are concatenated into a single write.

The ieplugin option is used by the `<jsp:plugin>` tags. If the Java Plug-in COM Class-ID you want to use changes then it can be specified here. This should not need to be altered.

uriroot specifies the root of the web application. This is where all absolute URIs will be resolved from. If it is not specified then the first JSP page will be used to derive it. To derive it each parent directory of the first JSP page is searched for a `WEB-INF` directory, and the directory closest to the JSP page that has one will be used. If none can be found then the directory Jasperc was called from will be used. This only affects pages translated from an explicitly declared JSP file—including references to taglibs.

uribase is used to establish the context of relative URI references in the JSP pages. If it does not exist then it is derived from the location of the file relative to the declared or derived value of uriroot. This only affects pages translated from an explicitly declared JSP file.

### Parameters specified as nested elements

This task is a directory based task, like `javac`, so the `.jsp` files to be compiled are located as `.java` files are by `javac`. That is, elements such as `includes` and `excludes` can be used directly inside the task declaration.

Elements specific to the `jspc` task are:

#### classpath

The classpath used to compile the JSP pages, specified as for any other classpath.

#### classpathref

a reference to an existing classpath

#### webapp

Instructions to Jasper to build an entire web application. The base directory must have a `WEB-INF` subdirectory beneath it. When used, the task hands off all dependency checking to the compiler.

Attribute | Description | Required
--- | --- | ---
basedir | the base directory of the web application | Yes

### Example

Build all `.jsp` files under `src/war` into the destination `/gensrc`, in a package hierarchy beginning with `com.i3sp.jsp`.

    <jspc srcdir="${basedir}/src/war"
          destdir="${basedir}/gensrc"
          package="com.i3sp.jsp"
          compiler="jasper41"
          verbose="9">
      <include name="**/*.jsp"/>
    </jspc>

Generate `.java` files from `.jsp` files, then `javac` them down to bytecode. Include `lib/taglibs.jar` in the Java compilation. Dependency checking is used to scrub the `.java` files if class dependencies indicate it is needed.

    <jspc destdir="interim"
          verbose="1"
          srcdir="src"
          compiler="jasper41"
          package="com.i3sp.jsp">
      <include name="**/*.jsp"/>
    </jspc>
    <depend srcdir="interim"
             destdir="build"
             cache="build/dependencies"
             classpath="lib/taglibs.jar"/>
    <javac srcdir="interim"
             destdir="build"
             classpath="lib/taglibs.jar"
             debug="on"/>

#### Notes

Using the package attribute it is possible to identify the resulting `.java` files and thus do full dependency checking—this task should only rebuild `.java` files if their `.jsp` file has been modified. However, this only works with some versions of Jasper. By default the checking supports Tomcat 4.0.x with the jasper compiler, set the compiler to jasper41 for the Tomcat 4.1.x dependency checking. Even when it does work, changes in `.tld` imports or in compile time includes do not get picked up.

Jasper generates JSP pages against the JSP 1.2 specification—a copy of version 2.3 of the servlet specification is needed on the classpath to compile the Java code.