Проблема запуска Tomcat с версией 9.0.12 - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь развернуть приложение на tomcat версии 9.0.12 с jre 1.8 и Eclipse Oxygen.

Но я постоянно сталкиваюсь со следующим исключением:

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
    ... 21 more
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader()Ljava/lang/ClassLoader;

Iу меня есть servlet-api-2.5.jar в моем classpath, который имеет метод getClassLoader.Не уверен, что я сделал неправильно.

Может кто-нибудь, пожалуйста, помогите мне с решением.

1 Ответ

0 голосов
/ 18 декабря 2018

Несмотря на ваше утверждение, ServletContext из вашего servlet-api-2.5.jar не может иметь рассматриваемый метод, если он действительно содержит спецификацию сервлета 2.5, как предлагается в имени файла.

ServletContext.getClassLoaderбыла введена в версии 3.0 спецификации сервлета:

/**
 * Get the web application class loader associated with this ServletContext.
 *
 * @return The associated web application class loader
 *
 * @throws UnsupportedOperationException    If called from a
 *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
 *    method of a {@link ServletContextListener} that was not defined in a
 *    web.xml file, a web-fragment.xml file nor annotated with
 *    {@link javax.servlet.annotation.WebListener}. For example, a
 *    {@link ServletContextListener} defined in a TLD would not be able to
 *    use this method.
 * @throws SecurityException if access to the class loader is prevented by a
 *         SecurityManager
 * @since Servlet 3.0
 */
public ClassLoader getClassLoader();

Поскольку Apache Tomcat 9 реализует Servlet 4.0 , вы не должны загрязнять путь к классам различными версиями API сервлета.

Tomcat уже поставляется с правильным servlet-api.jar, указанным в каталоге apache-tomcat/lib.Вы не должны добавлять какую-либо версию этого фляги в свое веб-приложение.Если вы используете maven, вы можете добавить ссылку на api сервлета 4 в области действия provided, поэтому ваша IDE и инструмент сборки knwo будут доступны во время выполнения, но не должны поставляться с вашими артефактами:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

или в качестве альтернативы для точного соответствия выбранной версии Apache Tomcat:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>9.0.12</version>
    <scope>provided</scope>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...