Как исправить "JARs, которые были отсканированы, но TLD не были найдены в них" в Tomcat 9.0.0M10
Я новичок в Java EE и пытаюсь работать над ServletContextListener, а работа с прослушивателем - это соединение с базой данных bla bla. Когда я пытаюсь запустить сервер (Tomcat 9), он застрял:
"INFO: по меньшей мере один JAR был отсканирован для TLD, но не содержал TLD. Включите ведение журнала отладки для этого регистратора для полного списка JAR, который были отсканированы, но в них не было обнаружено ни одного ДВУ. Пропуск ненужных JAR во время сканирования может улучшить время запуска и время компиляции JSP."
Итак, я изменил некоторые свойства в "файле свойств ведения журнала" следующим образом:
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler
# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE
# To see debug messages in TldLocationsCache, uncomment the following line:
org.apache.jasper.compiler.TldLocationsCache.level = FINE
org.apache.jasper.servlet.TldScanner.level = FINE
# To see debug messages for HTTP/2 handling, uncomment the following line:
#org.apache.coyote.http2.level = FINE
# To see debug messages for WebSocket handling, uncomment the following line:
#org.apache.tomcat.websocket.level = FINE
Все ответы приемлемы. Спасибо всем.
Ответы
Ответ 1
Это не ошибка и не проблема в tomcat. Tomcat просто информирует вас, что есть банки, которые не содержат TLD, и вы можете добавить их в список пропусков сканера, чтобы повысить производительность запуска. Таким образом, у вас есть два варианта:
-
Вы можете смело игнорировать этот намек. Тем не менее, если это вас раздражает, вы можете установить этот конкретный регистратор на более высокий уровень ведения журнала и, таким образом, предотвратить его запись в tomcat. Просто добавьте org.apache.jasper.servlet.TldScanner.level = SEVERE
в конец logging.properties.
-
Включить ведение журнала отладки, чтобы сделать tomcat список этих баннеров и добавить их в список пропуска. Установка:
org.apache.jasper.compiler.TldLocationsCache.level = FINE
org.apache.jasper.servlet.TldScanner.level = FINE
И добавьте имена печатных баннеров (без пути) в tomcat.util.scan.StandardJarScanFilter.jarsToSkip=...
в tomcat_dir/conf/catalina.properties
Ответ 2
Настройка регистрации в FINE, FINEST или ALL, чтобы найти все банки для исключения, не обязательно.
Вот script, который находит все банки, не содержащие TLD (измените переменную TOMCAT_HOME в соответствии с вашей установкой) и выведет список в форме
jar1.jar,\
jar2.jar,\
...
который можно вставить в каталины .properties(опустить последний, \'):
#!/bin/sh
TOMCAT_HOME=/opt/tomcat
for i in `find $TOMCAT_HOME -follow -name "*jar"`
do
jar tvf $i | grep -i tld > /dev/null
if [ $? -ne 0 ]; then
echo "$(basename $i),\\"
fi
done
Однако, если я правильно проинформирован, есть возможность в tomcat 9 исключить все банки, изменив (в catalina.properties):
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
к
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar
(закомментируйте список в строках ниже), а затем переопределите это решение для банок, содержащих TLD, изменив:
tomcat.util.scan.StandardJarScanFilter.jarsToScan=\
log4j-web*.jar,log4j-taglib*.jar,log4javascript*.jar,slf4j-taglib*.jar
и добавьте список, полученный путем изменения script выше, чтобы отобразить банки, которые содержат TLD:
#!/bin/sh
TOMCAT_HOME=/opt/tomcat
for i in `find $TOMCAT_HOME -follow -name "*jar"`
do
jar tvf $i | grep -i tld > /dev/null
if [ $? -eq 0 ]; then
echo "$(basename $i),\\"
fi
done
Ответ 3
изменить файл conf\context.xml
<Context>
<!-- only if you do not use jsp tag -->
<JarScanner>
<JarScanFilter defaultPluggabilityScan="false" defaultTldScan="false"/>
</JarScanner>
</Context>
см: https://tomcat.apache.org/tomcat-9.0-doc/config/jar-scan-filter.html
Ответ 4
та же проблема, я был исправлен.. Я думаю, что это проблема разрешения, поэтому нужно дать полный доступ к папке webapps/project.