Commit 26334494 authored by Emmanuel Bourg's avatar Emmanuel Bourg

New upstream version 9.0.17

parent e8e90a07
......@@ -93,13 +93,13 @@ source distribution, do the following:
(3.1) Checkout or obtain the source code for Tomcat @VERSION_MAJOR_MINOR@
Checkout the source using SVN, selecting a tag for released version or
trunk for the current development code, or download and unpack a source
Clone the source using git, then checkout a specific major branch or
master for the latest code development, or download and unpack a source
* Tomcat SVN repository URL:
* Tomcat GitHub repository URL:
* Source packages can be downloaded from:
......@@ -184,7 +184,7 @@ each release package has the appropriate line-endings.
(4) Updating sources and rebuilding
It is recommended that you regularly update the downloaded Tomcat @VERSION_MAJOR_MINOR@
sources using your SVN client.
sources using your git client.
For a quick rebuild of only modified code you can use:
# Contributing to Apache Tomcat
Firstly, thanks for your interest in contributing! I hope that this will be a
pleasant first experience for you, and that you will return to continue
pleasant experience for you, and that you will return to continue
Please visit our [Get Involved page](
......@@ -38,12 +38,12 @@ the issues marked 'Beginner', link below. Please note that the Beginner keyword
is pretty new to the project, so if there aren't any issues in the filter feel
free to ask on the [dev list](
* [Beginner issues]( -
* [Beginner issues]( -
issues which should only require a few lines of code, and a test or two to
The list above shows all bugs that are marked 'Beginner' and are open in the
currently supported Tomcat versions (7, 8, and 9).
currently supported Tomcat versions (7, 8.5, and 9).
If you prefer C over Java, you may also take a look at the tomcat-native and
Tomcat Connectors products in Bugzilla.
......@@ -57,11 +57,8 @@ committers of the project for review and acceptance.
You can provide a patch in one of the following ways (in order of preference):
* GitHub Pull Request
* Patch attachment to the Bugzilla issue
* Github Pull Request
> **Note:** Github is a mirror of the SVN repository that Tomcat is stored in
and therefore it can't be merged outright. Your contribution will be converted
into an SVN patch and committed with a mention of your name for credit.
* Email the patch to the developer list. This is not preferred, but if no bug
is associated with the patch, or you would like a developer review, an email
may be appropriate.
......@@ -73,51 +70,43 @@ source code.
###### Download The Source Distribution
This method works if you want to submit a patch (like you would do for SVN), but
This method works if you want to submit a patch via email, but
the difference in using the sources distribution and a VCS is that you have to
manually generate the patch file by using diff. If this is what you want, you
can download the sources from the "Source Code Distributions" section of the
Download Page. There is one such page for every major Tomcat version:
- [Tomcat 9](
- [Tomcat 8](
- [Tomcat 7](
###### SVN
##### Manual Patch Generation
If you have chosen to attach a patch to the Bugzilla issue (or email
one), then you'll need to checkout the SVN version. Instructions for new
committers to learn how to do this are found
[here]( However, in the
interest of a fast ramp up, the short version is below. Note that the root of
the SVN repository is
but you can clone specific versions too, such as
[tc8.5.x]( or even tags (
one), then you'll need to download the sources as noted above, make your
desired changes and then manually generate your patch using diff (other
other tool).
$ svn co
##### GitHub
##### Github
For Github, it's almost the same. Chose the major version that you want (for
now they're in different repositories), fork the repository, and then clone
your fork to do that work.
To submit a GitHub Pull Request you'll need to fork the
[repository](, clone your fork to do the work:
$ git clone$USERNAME/tomcat.git
and then push your changes, and submit a Pull Request via the GitHub UI.
#### Submitting Your Patch!
After you've chosen your method of submission, retrieved the sources, and
fixed the issue it's time to submit your work. At this point, just follow
the method of submission you chose earlier.
* Bugzilla attachment - attach the SVN patch to the Bugzilla issue
* Github PR - after resolving the issue in your local fork and pushing to your
copy of the repository, open a Github PR for review.
* GitHub PR - after resolving the issue in your local fork and pushing to your
copy of the repository, open a GitHub PR for review.
* Bugzilla attachment - attach the patch to the Bugzilla issue
* Email - again, not preferred, but you may send an email to the developer list
with a patch attached for review.
......@@ -33,14 +33,6 @@
# will be redirected.
# Default is $CATALINA_BASE/logs/catalina.out
# CATALINA_OUT_CMD (Optional) Command which will be executed and receive
# as its stdin the stdout and stderr from the Tomcat java
# process. If CATALINA_OUT_CMD is set, the value of
# CATALINA_OUT will be ignored.
# No default.
# Example (all one line)
# CATALINA_OUT_CMD="cronolog $CATALINA_BASE/logs/catalina.%Y-%m-%d.out >/dev/null 2>&1"
# CATALINA_OPTS (Optional) Java runtime options used when the "start",
# "run" or "debug" command is executed.
# Include here and not in JAVA_OPTS all options, that should
......@@ -451,23 +443,13 @@ elif [ "$1" = "start" ] ; then
if [ -z "$CATALINA_OUT_CMD" ] ; then
catalina_out_command=">> \"$CATALINA_OUT\" 2>&1"
catalina_out_command="| $CATALINA_OUT_CMD"
if [ ! -z "$CATALINA_PID" ]; then
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
-classpath "\"$CLASSPATH\"" \ \
......@@ -476,20 +458,24 @@ elif [ "$1" = "start" ] ; then
-Dcatalina.home="\"$CATALINA_HOME\"" \"\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
2\>\&1 \&\& echo \$! \>\"$catalina_pid_file\" \; \} $catalina_out_command "&"
>> "$CATALINA_OUT" 2>&1 "&"
-classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \"\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
2\>\&1 \&\& echo \$! \>\"$catalina_pid_file\" \; \} $catalina_out_command "&"
>> "$CATALINA_OUT" 2>&1 "&"
if [ ! -z "$CATALINA_PID" ]; then
echo $! > "$CATALINA_PID"
echo "Tomcat started."
elif [ "$1" = "stop" ] ; then
......@@ -25,7 +25,7 @@
# ----- Version Control Flags -----
......@@ -1205,7 +1205,7 @@
......@@ -2616,7 +2616,7 @@ skip.installer property in" />
<target name="download-compile"
description="Download (and build) components necessary to compile" >
description="Download components necessary to compile" >
<!-- Download Commons Daemon -->
<antcall target="downloadgz-2">
......@@ -115,10 +115,8 @@ aspectj*.jar,\
......@@ -172,16 +170,7 @@ tagsoup-*.jar,\
......@@ -16,4 +16,5 @@
elProcessor.defineFunctionInvalidMethod=Metoda [{0}] třídy [{1}] není public static metoda
importHandler.ambiguousStaticImport=Statický import [{0}] nelze zpracovat, neboť koliduje s [{1}] (který byl již naimportován)
importHandler.classNotFound=Třídu [{0}] nelze naimportovat, neboť nebyla nalezena
importHandler.invalidClassNameForStatic=Uvedená třída [{0}] pro statický import [{1}] není platná
......@@ -18,6 +18,7 @@ elProcessor.defineFunctionInvalidMethod=El método [{0}] en la clase [{1}] no es
importHandler.ambiguousStaticImport=La importación estática [{0}] no puede ser procesada pues entra en conflicto con [{1}] la cual ya ha sido importada
importHandler.classNotFound=La clase [{0}] no puede ser importada debido a que no fué encontrada
importHandler.invalidClassNameForStatic=La clase [{0}] especificada para importación estática [{1}] no es valida
importHandler.staticNotFound=La importación estática [{0}] no se pudo encontrar en la clase [{1}] para importar [{2}]
objectNotAssignable=No puedo añadir un objeto del tipo [{0}] a un arreglo de objetos del tipo [{1}]
propertyNotFound=Propiedad [{1}] no hallada en el tipo [{0}]
......@@ -22,6 +22,9 @@ elProcessor.defineFunctionInvalidParameterTypeName=类[{2}]的方法[{1}]的参
......@@ -15,6 +15,7 @@
err.cookie_name_blank=El nombre del Cookie no puede ser nulo o de longitud cero
err.cookie_name_is_token=El nombre de Cookie [{0}] es una palabra reservada pasó un valor Null para el arreglo byte en el método de escritura Corta
http.method_delete_not_supported=El Metodo HTTP DELETE no es soportado por esta URL
......@@ -1871,4 +1871,26 @@ public interface Context extends Container, ContextBind {
public void decrementInProgressAsyncCount();
* Configure whether Tomcat will attempt to create an upload target used by
* this web application if it does not exist when the web application
* attempts to use it.
* @param createUploadTargets {@code true} if Tomcat should attempt to
* create the upload target, otherwise {@code false}
public void setCreateUploadTargets(boolean createUploadTargets);
* Will Tomcat attempt to create an upload target used by this web
* application if it does not exist when the web application attempts to use
* it?
* @return {@code true} if Tomcat will attempt to create an upload target
* otherwise {@code false}
public boolean getCreateUploadTargets();
......@@ -32,6 +32,7 @@ formAuthenticator.forwardLoginFail=Error inesperado de reenvío a pagina de ingr
formAuthenticator.noErrorPage=No se ha definido página de error para la autenticación FORM en el contexto [{0}]
formAuthenticator.noLoginPage=No se ha definido página de ingreso para la autenticación FORM en el contexto [{0}]
singleSignOn.debug.principalCheck=SSO esta buscando un Principal cacheado para las sesión SSO [{0}]\n
singleSignOn.debug.principalFound=SSO encontró el Principal cacheado [{0}] con autenticación tipo [{1}]\n
singleSignOn.debug.removeSession=SSO removiendo la sesión de la aplicación [{0}] SSO con sesión [{1}]\n
singleSignOn.sessionExpire.hostNotFound=SSO es incapaz de expirar la session [{0}] porque el Host no puede ser encontrado
......@@ -60,6 +60,8 @@ coyoteRequest.sessionCreateCommitted=Cannot create a session after the response
coyoteRequest.sessionEndAccessFail=Exception triggered ending access to session while recycling request
coyoteRequest.setAttribute.namenull=Cannot call setAttribute with a null name
coyoteRequest.trailersNotReady=It is illegal to call getTrailerFields() before isTrailerFieldsReady() has returned true
coyoteRequest.uploadCreate=Creating the temporary upload location [{0}] as it is required by the servlet [{1}]
coyoteRequest.uploadCreateFail=Failed to create the upload location [{0}]
coyoteRequest.uploadLocationInvalid=The temporary upload location [{0}] is not valid
coyoteResponse.encoding.invalid=The encoding [{0}] is not recognised by the JRE
......@@ -19,6 +19,7 @@ coyoteAdapter.parsePathParam=Nelze načíst URL parametr pomocí kódování [{0
coyoteConnector.invalidEncoding=Kódování [{0}] není rozeznáno JRE. Kontektor použije [{1}]
coyoteConnector.invalidPort=Konektor nemůže nastartova, neboť uvedená hodnota portu [{0}] není platná
coyoteConnector.parseBodyMethodNoTrace=TRACE metoda nesmí obsahovat entitu (viz sekce 9.6 v RFC 2616)
coyoteInputStream.nbNotready=V neblokujícím módu nelze číst ServletInputStream aniž předchozí čtení bylo dokončeno a metoda isReady() vrátila hodnotu true
......@@ -27,12 +27,14 @@ coyoteConnector.protocolHandlerInstantiationFailed=Falló la instanciación del
coyoteConnector.protocolHandlerPauseFailed=Ha fallado la pausa del manejador de protocolo
coyoteConnector.protocolHandlerResumeFailed=Ha fallado el rearranque del manejador de protocolo
coyoteConnector.protocolHandlerStartFailed=Falló el arranque del manejador de protocolo
coyoteConnector.protocolHandlerStopFailed=Ocurrió un fallo al detener el manejador del protocolo
coyoteInputStream.nbNotready=En modo non-blocking usted no puede leer desde ServletInputStream hasta que la lectura previa haya sido completada y isReady() devuelva verdadero
coyoteRequest.alreadyAuthenticated=Este requerimiento ya ha sido autenticado
coyoteRequest.attributeEvent=Excepción lanzada mediante el escuchador de eventos de atributos
coyoteRequest.authenticate.ise=No puedo llamar a authenticate() tras haberse acometido la respuesta
coyoteRequest.changeSessionId=No se puede cambiar el ID de sesión. No hay sesión asociada con esta solicitud
coyoteRequest.chunkedPostTooLarge=No se han analizado los parámetros porque la medida de los datos enviados meiante "post" era demasiado grande. Debido a que este requerimiento es una parte del original, no puede ser procesado. Utiliza el atributo "maxPostSize" del conector para resolver esta situación, en caso de que la aplicación deba de aceptar POSTs mayores.
coyoteRequest.filterAsyncSupportUnknown=Imposible determinar si algún filtro no soporta procesamiento asincrónico
coyoteRequest.getInputStream.ise=getReader() ya ha sido llamado para este requerimiento
......@@ -41,6 +43,7 @@ coyoteRequest.gssLifetimeFail=Fallo al obtener el tiempo de vida restante para e
coyoteRequest.noMultipartConfig=Imposible procesar partes debido a que se ha proveído una configuración no multipartes
coyoteRequest.parseParameters=Excepción lanzada al procesar parámetros POST
coyoteRequest.postTooLarge=No se analizaron los parámetros porque la medida de los datos enviados era demasiado grande. Usa el atributo maxPostSize del conector para resolver esto en caso de que la aplicación debiera de aceptar POSTs más grandes.
coyoteRequest.sendfileNotCanonical=Incapaz de determinar el nombre canónico del archivo [{0}] especificado para ser usado con sendfile
coyoteRequest.sessionCreateCommitted=No puedo crear una sesión después de llevar a cabo la respueta
coyoteRequest.sessionEndAccessFail=Excepción disparada acabando acceso a sesión mientras se reciclaba el requerimiento
coyoteRequest.setAttribute.namenull=No pudeo llamar a setAttribute con un nombre nulo
......@@ -60,6 +60,8 @@ coyoteRequest.sessionCreateCommitted=Impossible de créer une session après que
coyoteRequest.sessionEndAccessFail=Exception lancée durant l'arrêt de l'accès à la session durant le recyclage de la requête
coyoteRequest.setAttribute.namenull=Impossible d'appeler "setAttribute" avec un nom nul
coyoteRequest.trailersNotReady=Impossible d'appeler getTrailerFields() avant que isTrailerFieldsReady() n'ait retourné true
coyoteRequest.uploadCreate=Un répertoire temporaire [{0}] pour les fichiers envoyés sera crée car il est requis par le Servlet [{1}]
coyoteRequest.uploadCreateFail=Echec de création du répertoire [{0}] pour les fichiers envoyés
coyoteRequest.uploadLocationInvalid=Le répertoire temporaire [{0}] pour les envois de fichier est invalide
coyoteResponse.encoding.invalid=L''encodage [{0}] n''est pas reconnu par le JRE
......@@ -29,6 +29,8 @@ coyoteConnector.parseBodyMethodNoTrace=TRACE メソッドのリクエストは
......@@ -58,6 +60,8 @@ coyoteRequest.sessionCreateCommitted=レスポンスをコミットした後で
coyoteResponse.encoding.invalid=JRE は文字エンコーディング [{0}] を理解しません。
......@@ -20,6 +20,8 @@ coyoteAdapter.parsePathParam=无法使用编码[{0}]解析地址参数,url中
coyoteConnector.invalidEncoding=编码 [{0}] 不能被 JRE 识别,Connector 将继续使用 [{1}]
coyoteConnector.invalidPort=连接器不能启动,因为指定的端口 [{0}]无效
......@@ -2815,6 +2815,15 @@ public class Request implements HttpServletRequest {
if (!location.exists() && context.getCreateUploadTargets()) {
location.getAbsolutePath(), getMappingData().wrapper.getName()));
if (!location.mkdirs()) {
if (!location.isDirectory()) {
partsParseException = new IOException(
......@@ -39,6 +39,7 @@ import org.apache.catalina.connector.Request;
import org.apache.catalina.util.SessionConfig;
import org.apache.coyote.ActionCode;
import org.apache.tomcat.util.buf.HexUtils;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.collections.CaseInsensitiveKeyMap;
import org.apache.tomcat.util.http.CookieProcessor;
import org.apache.tomcat.util.http.parser.HttpParser;
......@@ -158,6 +159,10 @@ public class ApplicationPushBuilder implements PushBuilder {
cookies.add(new Cookie(responseCookie.getName(), responseCookie.getValue()));
List<String> cookieValues = new ArrayList<>(1);
headers.put("cookie", cookieValues);
// Authentication
if (catalinaRequest.getPrincipal() != null) {
......@@ -339,7 +344,14 @@ public class ApplicationPushBuilder implements PushBuilder {
pushTarget.addPathParameter(sessionPathParameterName, sessionId);
if (addSessionCookie) {
cookies.add(new Cookie(sessionCookieName, sessionId));
String sessionCookieHeader = sessionCookieName + "=" + sessionId;
MessageBytes mb = pushTarget.getMimeHeaders().getValue("cookie");
if (mb == null) {
mb = pushTarget.getMimeHeaders().addValue("cookie");
} else {
mb.setString(mb.getString() + ";" + sessionCookieHeader);
......@@ -357,11 +369,6 @@ public class ApplicationPushBuilder implements PushBuilder {
pushTarget.queryString().setString(pushQueryString + "&" +queryString);
// Cookies
// Authorization
if (userName != null) {
......@@ -176,7 +176,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
public void dispatch(ServletContext context, String path) {
public void dispatch(ServletContext servletContext, String path) {
synchronized (asyncContextLock) {
if (log.isDebugEnabled()) {
logDebug("dispatch ");
......@@ -193,7 +193,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
request.setAttribute(ASYNC_PATH_INFO, request.getPathInfo());
request.setAttribute(ASYNC_QUERY_STRING, request.getQueryString());
final RequestDispatcher requestDispatcher = context.getRequestDispatcher(path);
final RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
if (!(requestDispatcher instanceof AsyncDispatcher)) {
throw new UnsupportedOperationException(
......@@ -202,11 +202,16 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback {
(AsyncDispatcher) requestDispatcher;
final ServletRequest servletRequest = getRequest();
final ServletResponse servletResponse = getResponse();
// Take a local copy as the dispatch may complete the
// request/response and that in turn may trigger recycling of this
// object before the in-progress count can be decremented
final Context context = this.context;
this.dispatch = new AsyncRunnable(
request, applicationDispatcher, servletRequest, servletResponse);
this.request.getCoyoteRequest().action(ActionCode.ASYNC_DISPATCH, null);
......@@ -17,6 +17,7 @@ applicationContext.addJspFile.iae=JSP soubor [{0}] není validní
applicationContext.addListener.iae.cnfe=Nelze vytvořit instanci typu [{0}]
applicationContext.addListener.iae.wrongType=Specifikovaný typ [{0}] není mezi očekávanými typy listenerem
applicationContext.setAttribute.namenull=Jméno nemůže mít hodnotu null
applicationContext.setSessionTracking.ise=Sledovací mód session pro kontext [{0}] nelze nastavit, neboť kontext právě běží
applicationDispatcher.specViolation.response=Původní ServletResponse nebo zapouzdřený původní ServletResponse nebyl předán do RequestDispatcher, což je porušení SRV.8.2 a SRV.
......@@ -24,12 +25,18 @@ applicationFilterRegistration.nullInitParams=Není možné nastavit inicializač
aprListener.initializingFIPS=Inicializace FIPS módu...
containerBase.backgroundProcess.cluster=Výjimka při zpracování procesu na pozadí v clusteru [{0}]
containerBase.backgroundProcess.unexpectedThreadDeath=Neočekávaní ukončení vlákna na pozadí [{0}]
defaultInstanceManager.invalidInjection=Neplatá anotace pro vložení zdroje (resource) na metodě
defaultInstanceManager.restrictedContainerServlet=Přístup ke třídě [{0}] je zakázán. Jedná se o exkluzivní třítu (implementující interface ContainerServlet). Webová aplikace musí mít nakonfigurované potřebné právo (pro nahrání této třídy).
defaultInstanceManager.restrictedFiltersResource=Property soubor pro omezující filtry nenalezen [{0}]
defaultInstanceManager.restrictedListenersResource=Property soubor (Restricted listeners) nebyl nalezen [{0}]
filterChain.filter=Zpracování filtru vyhodilo výjimku
naming.addEnvEntry=Přidání proměnné prostředí [{0}]
naming.namingContextCreationFailed=Selhalo vytvoření jmenného kontextu: [{0}]
naming.wsdlFailed=Selhalo nalezení WSDL souboru: [{0}]
standardContext.filterStart=Zahajuji filtr výjimek [{0}]
......@@ -22,6 +22,7 @@ applicationContext.addListener.ise=No se pueden añadir escuchadores al contexto
applicationContext.addRole.ise=No se pueden añadir roles al contexto [{0}], una vez que ha sido inicializado.
applicationContext.addServlet.ise=No se pueden añadir servlets al contexto [{0}], una vez que ha sido inicializado.
applicationContext.attributeEvent=Excepción lanzada por escuchador de eventos de atributos
applicationContext.invalidServletName=Incapaz de añadir la definición servlet devido a que el nombre servlet no es válido [{0}].
applicationContext.lookup.error=No pude localizar el recurso [{0}] en el contexto [{1}]
applicationContext.mapping.error=Error durante mapeo
applicationContext.requestDispatcher.iae=La Trayectoria [{0}] no comienza con carácter "/"
......@@ -29,6 +30,7 @@ applicationContext.resourcePaths.iae=La Trayectoria [{0}] no comienza con carác
applicationContext.role.iae=Un rol individual que se ha de declarar para el contexto [{0}] no puede ser nulo o cadena vacía
applicationContext.roles.iae=Un arreglo de roles que se ha de declarar para el contexto [{0}] no puede ser nulo o cadena vacía
applicationContext.setAttribute.namenull=El nombre no puede ser nulo
applicationContext.setSessionTimeout.ise=El timeout de la sesión no pudo ser fijado para el contexto [{0}] debido a que el contexto ha sido inicializado
applicationContext.setSessionTracking.iae.invalid=El modo de seguimiento de sesión [{0}] requerido para el contexto [{1}] no está soportado por este contexto
applicationContext.setSessionTracking.iae.ssl=Los modos de seguimiento de sesión requeridos para el contexto [{0}], incluyó SSL y al menos otro modo. SSL no se puede configurar con otros modos.
applicationContext.setSessionTracking.ise=No se pueden poner los modos de seguimiento de sesión para el contexto [{0}] mientras el contexto se está ejecutando.
......@@ -60,6 +62,7 @@ aprListener.sslInit=No pude inicializar el SSLEngine (Motor SSL)
aprListener.tcnInvalid=Se encuentra instalada una versión incompatible [{0}] de la biblioteca nativa APR de Apache Tomcat, mientras que Tomcat necesita la versión [{1}]
aprListener.tcnValid=Cargada la biblioteca nativa APR de Apache Tomcat [{0}] con la versión APR [{1}].
aprListener.tcnVersion=Se encuentra instalada una versión muy vieja [{0}] de la biblioteca nativa APR de Apache Tomcat, mientras que Tomcat recomienda una versión mayor de [{1}]
aprListener.tooLateForFIPSMode=No se pudo fijar setFIPSMode: SSL ya ha sido inicializado
asyncContextImpl.requestEnded=El requerimiento asociado con AsyncContext ya ha completado su procesamiento.
......@@ -115,6 +118,7 @@ standardContext.loginConfig.loginPage=La página de login de Formulario [{0}] de
standardContext.loginConfig.loginWarning=AVISO: La página de login de Formulario [{0}] debe de comenzar con ''/'' en Servlet 2.4
standardContext.loginConfig.required=LoginConfig no puede ser nula
standardContext.manager=Configurado un gestor de la clase [{0}]
standardContext.managerFail=El manejador de sesiones falló al iniciar pude destruir recursos de viejo nombre pude inicializar recursos de nuevo nombre
standardContext.noResourceJar=Los JARs de recurso no están soportados. El JAR hallado en [{0}] no se utilizará para proveer de contenido estático para el contexto con nombre [{1}]
......@@ -135,6 +139,7 @@ standardContext.servletMap.pattern=<url-pattern> [{0}] inválida en mapeo de ser
standardContext.startFailed=Falló en arranque del Contexto [{0}] debido a errores previos
standardContext.startingContext=Excepción arrancando Contexto con nombre [{0}]
standardContext.stoppingContext=Excepción parando Context [{0}]
standardContext.unknownCookieEncoding=La codificación desconocida [{0}] fue especificada para setCookieEncoding(String) por lo cual la default UTF-8 será usada en su lugar
standardContext.urlPattern.patternWarning=AVISO: el patrón URL [{0}] debe de comenzar con ''/'' en Servlet 2.4
standardContext.workCreateException=No pude determinar directorio absoluto de trabajo a partir del directorio [{0}] y CATALINA_HOME [{1}] para el contexto [{2}]
standardContext.workCreateFail=No pude crear el directorio de trabajo [{0}] para el contexto [{1}]
......@@ -222,6 +222,7 @@ standardContext.setManager.start=新しいマネージャーの開始時にエ
standardContext.startFailed=以前のエラーのためにコンテキストの起動が失敗しました [{0}]
standardContext.stop.asyncWaitInterrupted=実行中の非同期要求が完了するのをunloadDelayミリ秒待っている間に割り込みを受信しました。 コンテキスト停止はさらに遅れることなく続行されます。
standardContext.suspiciousUrl=コンテキスト [{1}] に不審な URL パターン [{0}] があります。サーブレット仕様の 12.1 および 12.2 を参照してください。
standardContext.threadBindingListenerError=コンテキスト [{0}] に構成されたリスナーを束縛するスレッドで異常が発生しました。
......@@ -77,6 +77,7 @@ standardContext.resourcesStop=停止静态资源时出错
standardContext.securityConstraint.mixHttpMethod=在相同的web资源集合中不允许混用: <http-method> 和 <http-method-omission>
standardContext.securityConstraint.pattern=安全约束中的<url-pattern> [{0}] 无效
standardContext.servletFail=启动时无法加载一个或多个Servlet。 全部的详细信息可在相应的容器日志文件中找到
......@@ -60,6 +60,7 @@ import org.apache.naming.ResourceLinkRef;
import org.apache.naming.ResourceRef;
import org.apache.naming.ServiceRef;
import org.apache.naming.TransactionRef;
import org.apache.naming.factory.Constants;
import org.apache.naming.factory.ResourceLinkFactory;
import org.apache.tomcat.util.descriptor.web.ContextEjb;
import org.apache.tomcat.util.descriptor.web.ContextEnvironment;
......@@ -1010,16 +1011,21 @@ public class NamingContextListener
if (("javax.sql.DataSource".equals(ref.getClassName()) ||
"javax.sql.XADataSource".equals(ref.getClassName())) &&
resource.getSingleton()) {
Object actualResource = null;
try {
ObjectName on = createObjectName(resource);
Object actualResource = envCtx.lookup(resource.getName());
actualResource = envCtx.lookup(resource.getName());
Registry.getRegistry(null, null).registerComponent(actualResource, on, null);
objectNames.put(resource.getName(), on);
} catch (Exception e) {
log.warn(sm.getString("naming.jmxRegistrationFailed", e));
// Bug 63210. DBCP2 DataSources require an explicit close. This goes
// further and cleans up and AutoCloseable DataSource by default.
if (actualResource instanceof AutoCloseable && !resource.getCloseMethodConfigured()) {
......@@ -822,9 +822,23 @@ public class StandardContext extends ContainerBase
private final AtomicLong inProgressAsyncCount = new AtomicLong(0);
private boolean createUploadTargets = false;