Closed ghost closed 7 years ago
twelve seconds is a long time to compile such a simple JSP, so it may be something else in your app is taking that time to initialise???? So it would be good if you could get a debug log or some other indication (file datestamps) that it is actually compilation that is causing this 12s delay.
cheers
@gouessej I can't reproduce this with the standard jetty test webapp, and precompiling the jsps.
If your web.xml contains servlet definitions and path mappings, then the jsp servlet is never invoked so no on-the-fly compilations are done. Could it be a filter or other initialization in your webapp that is taking the time? Things to look at:
Thank you for your help.
@gregw How can I enable the debug log? I've already enabled for the logs (I see the info and warn levels), I use StdErrLog (console-capture). As far as I remember, I shouldn't use org.eclipse.jetty.util.log.DEBUG.
I haven't modified webdefault.xml but I have modified web.xml. I'll post it as soon as possible.
My webapp is currently terribly simple, there is nothing in my WEB-INF/lib. I don't use Spring, I don't use JSTL. Actually, I use no third party library for the moment, even the JDBC part isn't ready. I'll look at /opt/jetty/temp.
Yesterday, I removed 2 other JSPs, I kept only the rudimentary JSP above and it still took 3 seconds at the first access. Should I insert <load-on-startup>0</load-on-startup>
into web.xml for each JSP? It would require to modify the file web.xml generated by jetty-jspc-maven-plugin before it gets included into the WAR or to run mvn package
twice (once to generate web.xml with jetty-jspc-maven-plugin, once again to insert web.xml modified by me into the WAR).
extractWar is set to true in my webapp configuration file.
@gregw Thanks. By the way, jetty-logging.xml has to be renamed console-capture.xml here too.
This is my web.xml file:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" metadata-complete="false" version="3.1">
<description>
web.xml file. This file is applied to a Web application after its default (etc/webdefault.xml) file
</description>
<!--
====================================================================
-->
<!--
Removes static references to beans from javax.el.BeanELResolver to
-->
<!--
ensure webapp classloader can be released on undeploy
-->
<!--
====================================================================
-->
<listener>
<listener-class>
org.eclipse.jetty.servlet.listener.ELContextCleaner
</listener-class>
</listener>
<!--
====================================================================
-->
<!--
Removes static cache of Methods from java.beans.Introspector to
-->
<!--
ensure webapp classloader can be released on undeploy
-->
<!--
====================================================================
-->
<listener>
<listener-class>
org.eclipse.jetty.servlet.listener.IntrospectorCleaner
</listener-class>
</listener>
<!--
====================================================================
-->
<!-- Context params to control Session Cookies -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<!--
UNCOMMENT TO ACTIVATE
<context-param>
<param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
<param-value>127.0.0.1</param-value>
</context-param>
<context-param>
<param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
<param-value>/</param-value>
</context-param>
<context-param>
<param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
<param-value>-1</param-value>
</context-param>
-->
<!--
====================================================================
-->
<!-- The default servlet. -->
<!--
This servlet, normally mapped to /, provides the handling for static
-->
<!--
content, OPTIONS and TRACE methods for the context.
-->
<!-- The following initParameters are supported: -->
<!--
* acceptRanges If true, range requests and responses are
* supported
*
* dirAllowed If true, directory listings are returned if no
* welcome file is found. Else 403 Forbidden.
*
* welcomeServlets If true, attempt to dispatch to welcome files
* that are servlets, but only after no matching static
* resources could be found. If false, then a welcome
* file must exist on disk. If "exact", then exact
* servlet matches are supported without an existing file.
* Default is true.
*
* This must be false if you want directory listings,
* but have index.jsp in your welcome file list.
*
* redirectWelcome If true, welcome files are redirected rather than
* forwarded to.
*
* gzip If set to true, then static content will be served as
* gzip content encoded if a matching resource is
* found ending with ".gz"
*
* resourceBase Set to replace the context resource base
*
* resourceCache If set, this is a context attribute name, which the servlet
* will use to look for a shared ResourceCache instance.
*
* relativeResourceBase
* Set with a pathname relative to the base of the
* servlet context root. Useful for only serving static content out
* of only specific subdirectories.
*
* pathInfoOnly If true, only the path info will be applied to the resourceBase
*
* stylesheet Set with the location of an optional stylesheet that will be used
* to decorate the directory listing html.
*
* aliases If True, aliases of resources are allowed (eg. symbolic
* links and caps variations). May bypass security constraints.
*
* etags If True, weak etags will be generated and handled.
*
* maxCacheSize The maximum total size of the cache or 0 for no cache.
* maxCachedFileSize The maximum size of a file to cache
* maxCachedFiles The maximum number of files to cache
*
* useFileMappedBuffer
* If set to true, it will use mapped file buffers to serve static content
* when using an NIO connector. Setting this value to false means that
* a direct buffer will be used instead of a mapped file buffer.
* This file sets the value to true.
*
* cacheControl If set, all static content will have this value set as the cache-control
* header.
*
-->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
<init-param>
<param-name>aliases</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>acceptRanges</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>dirAllowed</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>welcomeServlets</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>redirectWelcome</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>maxCacheSize</param-name>
<param-value>256000000</param-value>
</init-param>
<init-param>
<param-name>maxCachedFileSize</param-name>
<param-value>200000000</param-value>
</init-param>
<init-param>
<param-name>maxCachedFiles</param-name>
<param-value>2048</param-value>
</init-param>
<init-param>
<param-name>gzip</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>etags</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>true</param-value>
</init-param>
<!--
<init-param>
<param-name>resourceCache</param-name>
<param-value>resourceCache</param-value>
</init-param>
-->
<init-param>
<param-name>cacheControl</param-name>
<param-value>
max-age=0,no-cache,no-store,must-revalidate,no-transform
</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--
====================================================================
-->
<!-- JSP Servlet -->
<!-- This is the jasper JSP servlet. -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<!--
The JSP page compiler and execution servlet, which is the mechanism
-->
<!--
used by the jsp container to support JSP pages. Traditionally,
-->
<!--
this servlet is mapped to URL pattern "*.jsp". This servlet
-->
<!--
supports the following initialization parameters (default values
-->
<!-- are in square brackets): -->
<!-- -->
<!--
checkInterval If development is false and reloading is true,
-->
<!-- background compiles are enabled. checkInterval -->
<!-- is the time in seconds between checks to see -->
<!-- if a JSP page needs to be recompiled. [300] -->
<!-- -->
<!--
compiler Which compiler Ant should use to compile JSP
-->
<!-- pages. See the Ant documentation for more -->
<!-- information. [javac] -->
<!-- -->
<!--
classdebuginfo Should the class file be compiled with
-->
<!-- debugging information? [true] -->
<!-- -->
<!--
classpath What class path should I use while compiling
-->
<!-- generated servlets? [Created dynamically -->
<!-- based on the current web application] -->
<!-- Set to ? to make the container explicitly set -->
<!-- this parameter. -->
<!-- -->
<!--
development Is Jasper used in development mode (will check
-->
<!-- for JSP modification on every access)? [true] -->
<!-- -->
<!--
enablePooling Determines whether tag handler pooling is
-->
<!-- enabled [true] -->
<!-- -->
<!--
fork Tell Ant to fork compiles of JSP pages so that
-->
<!-- a separate JVM is used for JSP page compiles -->
<!-- from the one Tomcat is running in. [true] -->
<!-- -->
<!--
ieClassId The class-id value to be sent to Internet
-->
<!-- Explorer when using <jsp:plugin> tags. -->
<!-- [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93] -->
<!-- -->
<!--
javaEncoding Java file encoding to use for generating java
-->
<!-- source files. [UTF-8] -->
<!-- -->
<!--
keepgenerated Should we keep the generated Java source code
-->
<!-- for each page instead of deleting it? [true] -->
<!-- -->
<!--
logVerbosityLevel The level of detailed messages to be produced
-->
<!-- by this servlet. Increasing levels cause the -->
<!-- generation of more messages. Valid values are -->
<!-- FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
<!-- [WARNING] -->
<!-- -->
<!--
mappedfile Should we generate static content with one
-->
<!-- print statement per input line, to ease -->
<!-- debugging? [false] -->
<!-- -->
<!-- -->
<!--
reloading Should Jasper check for modified JSPs? [true]
-->
<!-- -->
<!--
suppressSmap Should the generation of SMAP info for JSR45
-->
<!-- debugging be suppressed? [false] -->
<!-- -->
<!--
dumpSmap Should the SMAP info for JSR45 debugging be
-->
<!-- dumped to a file? [false] -->
<!-- False if suppressSmap is true -->
<!-- -->
<!--
scratchdir What scratch directory should we use when
-->
<!-- compiling JSP pages? [default work directory -->
<!-- for the current web application] -->
<!-- -->
<!--
tagpoolMaxSize The maximum tag handler pool size [5]
-->
<!-- -->
<!--
xpoweredBy Determines whether X-Powered-By response
-->
<!-- header is added by generated servlet [false] -->
<!-- -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<servlet id="jsp">
<servlet-name>jsp</servlet-name>
<servlet-class>org.eclipse.jetty.jsp.JettyJspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.7</param-value>
</init-param>
<init-param>
<param-name>compilerSourceVM</param-name>
<param-value>1.7</param-value>
</init-param>
<!--
<init-param>
<param-name>classpath</param-name>
<param-value>?</param-value>
</init-param>
-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspf</url-pattern>
<url-pattern>*.jspx</url-pattern>
<url-pattern>*.xsp</url-pattern>
<url-pattern>*.JSP</url-pattern>
<url-pattern>*.JSPF</url-pattern>
<url-pattern>*.JSPX</url-pattern>
<url-pattern>*.XSP</url-pattern>
</servlet-mapping>
<!--
====================================================================
-->
<!-- Default session configuration -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!--
====================================================================
-->
<!-- Default MIME mappings -->
<!--
The default MIME mappings are provided by the mime.properties
-->
<!--
resource in the jetty-http.jar file. Additional or modified
-->
<!-- mappings may be specified here -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<!--
UNCOMMENT TO ACTIVATE
<mime-mapping>
<extension>mysuffix</extension>
<mime-type>mymime/type</mime-type>
</mime-mapping>
-->
<!--
====================================================================
-->
<!-- Default welcome files -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--
====================================================================
-->
<!-- Default locale encodings -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>ar</locale>
<encoding>ISO-8859-6</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>be</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>bg</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>ca</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>cs</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>da</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>de</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>el</locale>
<encoding>ISO-8859-7</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>en</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>es</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>et</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>fi</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>fr</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>hr</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>hu</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>is</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>it</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>iw</locale>
<encoding>ISO-8859-8</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>ja</locale>
<encoding>Shift_JIS</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>ko</locale>
<encoding>EUC-KR</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>lt</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>lv</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>mk</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>nl</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>no</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>pl</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>pt</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>ro</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>ru</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>sh</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>sk</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>sl</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>sq</locale>
<encoding>ISO-8859-2</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>sr</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>sv</locale>
<encoding>ISO-8859-1</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>tr</locale>
<encoding>ISO-8859-9</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>uk</locale>
<encoding>ISO-8859-5</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>zh</locale>
<encoding>GB2312</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>zh_TW</locale>
<encoding>Big5</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
<!--
====================================================================
-->
<!-- Disable TRACE method with security constraint -->
<!--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
<context-param>
<param-name>org.eclipse.jetty.jsp.precompiled</param-name>
<param-value>true</param-value>
</context-param>
<!--
Automatically created by Apache Tomcat JspC.
Place this fragment in the web.xml before all icon, display-name,
description, distributable, and context-param elements.
-->
<servlet>
<servlet-name>org.apache.jsp.index_jsp</servlet-name>
<servlet-class>org.apache.jsp.index_jsp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>org.apache.jsp.index_jsp</servlet-name>
<url-pattern>/index.jsp</url-pattern>
</servlet-mapping>
<!--
All session-config, mime-mapping, welcome-file-list, error-page, taglib,
resource-ref, security-constraint, login-config, security-role,
env-entry, and ejb-ref elements should follow this fragment.
-->
</web-app>
@janbartel Do you see anything special in the file above?
/tmp/jetty-0.0.0.0-8080-beta.***.org.war-_-beta.**.org-3115377452863405265.dir/jsp/ is totally empty even after going to the homepage using JSP. I don't understand what's wrong. The class files are in the WAR in WEB-INF/classes/org/apache/jsp, WEB-INF/web.xml contains the necessary definition and servlet mappings.
Julien,
this kind of indicates that whatever the delay is, it is not JSP compilation.
Try taking some thread dumps during the delay and looking for active threads.
regards
On 6 August 2017 at 09:11, Julien Gouesse notifications@github.com wrote:
/tmp/jetty-0.0.0.0-8080-beta.*.org.war-_-beta..org-3115377452863405265.dir/jsp/ is totally empty even after going to the homepage using JSP. I don't understand what's wrong. The class files are in the WAR in WEB-INF/classes/org/apache/jsp, WEB-INF/web.xml contains the necessary definition and servlet mappings.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/eclipse/jetty.project/issues/1699#issuecomment-320475511, or mute the thread https://github.com/notifications/unsubscribe-auth/AAEUreiUG1joRCfqaOyjjV2drkxkDEtLks5sVPajgaJpZM4Onuva .
-- Greg Wilkins gregw@webtide.com CTO http://webtide.com
I can probably use jstack to do that.
@gouessej I'm going to close this issue since you've confirmed that the precompiled jsps aren't being recompiled. If you find some other problem with jetty, please go ahead and open a fresh issue and attach all the relevant information such as thread dumps, stack traces, config files and repro test case if possible.
Hi
I use Jetty 9.4.6 v20170531. My JSP classes are precompiled by jetty-jspc-maven-plugin:
The merged file web.xml is included in my WAR:
web.xml contains the expected lines about jspc:
followed by the servlets and the servlet mappings of my JSPs...
However, the very first time I access one of those JSPs, the web page takes about 12 seconds to load, it looks like my JSPs get compiled anew whereas it's useless. When I access this JSP after this first try, it's as fast as expected, it takes about 100 milliseconds. The first JSP I tried contains this:
I don't see how such a rudimentary JSP could take several seconds to execute. Is there anything I can add to check whether Jetty precompiled my JSPs?