That can be quite a few different things, and you didn't give enough details...
Do you use exploded folder deployment or .war / .ear archive deployment ?
Do you use deployment scanner or manage the deployment in web / CLI console ?
Try using .war archive and managed deployment if you're not now.
There is another possible scenario I can recall: https://bz.apache.org/bugzilla/show_bug.cgi?id=33453
Basically, jasper makes a decision whether to compile the JSP or not based on the comparison of timestamps in the files (between current compiled .class file, and .jsp file).
An example is given by Jonathan in c#9:
Here is a scenario that shows the problem:
- I deploy version 1, the .jsp has time1
- I make version 2 of the .jsp at time2
- Visitor visits the site, and the .jsp is compiled at time3
- I deploy version2
- isOutDated returns false as time3 > time2
In this scenario, though version2 is actually newer, it won't compile it again ( keep using version 1 ), as version1's compiled .class file has a newer timestamp than version2 jsp ...
And you need to "touch" the jsp file on server to give a newer timestamp.