programing

NoSch Method Error: javax.servlet을 가져오는 중입니다.Spring MVC 응용 프로그램 실행 중 Spring Boot의 ServletContext.addServlet

showcode 2023. 3. 16. 22:02
반응형

NoSch Method Error: javax.servlet을 가져오는 중입니다.Spring MVC 응용 프로그램 실행 중 Spring Boot의 ServletContext.addServlet

Spring 부트를 사용하여 Spring MVC 응용 프로그램을 실행하려고 하면 예외가 발생합니다.

ContainerBase: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:799)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 6 more
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.addServlet(Ljava/lang/String;Ljavax/servlet/Servlet;)Ljavax/servlet/ServletRegistration$Dynamic;
    at org.springframework.boot.context.embedded.ServletRegistrationBean.onStartup(ServletRegistrationBean.java:166)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:214)
    at org.springframework.boot.context.embedded.tomcat.ServletContextInitializerLifecycleListener.lifecycleEvent(ServletContextInitializerLifecycleListener.java:54)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more

클래스가 어디서 로딩되는지 알아보려면

java -verbose:class -jar foo.jar | grep javax.servlet.ServletContext

서 ''는foo.jarJAR하다를 들면, 「」는,ServletContext 든 에게서 읽힐 수 있다servlet-apiMaven Gradle JDK JAR.

명령어의 출력은 다음과 같습니다.

$ java -verbose:class -jar build/libs/foo-0.2.3.jar | grep javax.servlet.ServletContext
[Loaded javax.servlet.ServletContext from jar:file:.../build/libs/foo-0.2.3.jar!/lib/javax.servlet-api-3.1.0.jar!/]
[Loaded javax.servlet.ServletContextListener from jar:file:.../build/libs/foo-0.2.3.jar!/lib/javax.servlet-api-3.1.0.jar!/]
[Loaded javax.servlet.ServletContextAttributeListener from jar:file:.../build/libs/foo-0.2.3.jar!/lib/javax.servlet-api-3.1.0.jar!/]

transitional servlet-api 의존관계를 제외하고 해결했습니다.

제 경우 com.github.isrsal: spring-mvc-logger였습니다.

<dependency>
    <groupId>com.github.isrsal</groupId>
    <artifactId>spring-mvc-logger</artifactId>
    <version>0.2</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

그래들 용액

lib jar에서도 비슷한 문제가 발생했는데, 어떤 이유에서인지 javax.servlet의 이전 버전을 가져오게 되었습니다.나중에 스프링 부트모듈에 의해 로드된 Servlet Context로 인해 NoSuch Method Error가 발생하였습니다.

lib 모듈의 build.gradle을 편집하여 수정했습니다.

configurations {
    provided.all*.exclude group: 'javax.servlet'
}

제외해서 해결하지 못한 다른 분들을 위해servlet-api대체 방법은 다음과 같습니다.

Spring Boot 기본값은 Tomcat 8인 것으로 나타났습니다.다른 버전의 Tomcat을 실행하고 있으며 이 오류를 수정하려면 Tomcat 버전을 pom 속성에 추가하십시오.

<properties>
    <tomcat.version>7.0.63</tomcat.version>
</properties> 

이 기능은 스프링 부트 웹 앱에 있고 배포 서버에만 있습니다(로컬 머신에서는 정상적으로 실행되고 있었습니다).다음을 추가하여 해결합니다.

<dependencies>
<!-- … -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<!-- … -->

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html

테스트 에 스프링 부트서버를 기동하려고 했을 때 이 문제가 발생했습니다(그래들+스팍 사용).나는 그 문제를 와이어목 라이브러리로 추적했다.

이것으로 수정:

testCompile('com.github.tomakehurst:wiremock:1.58') {
    exclude module: 'servlet-api' // this exclude fixed it
}

참고:

gradle dependencies

에 다음 내용을 나타냅니다(요약).

\--- com.github.tomakehurst:wiremock:1.58
     +--- org.mortbay.jetty:jetty:6.1.26
          +--- org.mortbay.jetty:jetty-util:6.1.26
          \--- org.mortbay.jetty:servlet-api:2.5-20081211

고2008 (2008)org.mortbay.jetty:servlet-api에는 항아리 있습니다.ServletContext이는 스프링 부트 버전 1.3.2와 호환되지 않습니다(최소 1.2.6까지 정상 작동).

Gradle을 사용하고 있었는데, 어떤 점이 효과가 있었는지:

configurations {
    all*.exclude group: '', module: 'servlet-api'
}

원하는 방식으로 종속성 트리를 잘라냈습니다.

Spring-boot을 사용하여 Hadoop 2.7.2로 실행 중이었는데, 다음 Hadoop 종속성이 javax.servlet을 사용하여 내장 Tomcat 버전을 시작하지 못했습니다.아래의 POM 제외로 문제가 해결되었습니다.

                                    <dependency>
                                    <groupId>org.apache.hadoop</groupId>
                                    <artifactId>hadoop-hdfs</artifactId>
                                    <version>2.7.2</version>
                                    <exclusions>
                                        <exclusion>
                                            <artifactId>servlet-api</artifactId>
                                            <groupId>javax.servlet</groupId>
                                        </exclusion>
                                    </exclusions>
                                </dependency>
                                <dependency>
                                    <groupId>org.springframework.data</groupId>
                                    <artifactId>spring-data-hadoop-boot</artifactId>
                                    <version>2.3.0.RELEASE-hadoop26</version>
                                    <exclusions>
                                        <exclusion>
                                            <artifactId>servlet-api</artifactId>
                                            <groupId>javax.servlet</groupId>
                                        </exclusion>
                                    </exclusions>
                                </dependency>

                                <dependency>
                                    <groupId>org.apache.hadoop</groupId>
                                    <artifactId>hadoop-common</artifactId>
                                    <version>2.7.2</version>
                                    <exclusions>
                                        <exclusion>
                                            <artifactId>slf4j-log4j12</artifactId>
                                            <groupId>org.slf4j</groupId>
                                        </exclusion>
                                        <exclusion>
                                            <artifactId>servlet-api</artifactId>
                                            <groupId>javax.servlet</groupId>
                                        </exclusion>
                                    </exclusions>
                                </dependency>

이 솔루션에 따르면 https://stevewall123.wordpress.com/2015/04/17/spring-boot-application-and-tomcat-error-a-child-container-failed-during-start/

Tomcat 버전을 변경하려면 "tomcat"을 설정합니다.version" 속성:

ext['tomcat.version'] = '7.0.63' //my version of Tomcat

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}

그 기사의 저자 덕분에 효과가 있었어요.

건배 :)

문제가 있는 레퍼런스가 어떻게든 클래스 패스에 들어가는 것을 알고 있는 것 이외에는 추적할 수 없었습니다.따라서 이클립스를 사용하는 게으른 개발자를 위한 2센트입니다.

프로젝트 트리 아래(통상 Java Resources -> Libraries -> Maven Dependencies)의 maven 의존관계 목록을 아래로 스크롤하여 패키지화된 JAR에서 제외할 문제가 있는 추가 jar를 추적한 후 해당 jar를 우클릭합니다.-> [ Maven - ]-> [ Exclude Maven Artact ]Voila - 자동으로 그것을 참조하는 의존관계 바로 아래에 제외가 추가됩니다.

내 BTW는 지프들이야

        <dependency>
        <groupId>org.codelibs</groupId>
        <artifactId>jcifs</artifactId>
        <version>1.3.18.2</version>
        <exclusions>
            <exclusion>
                <artifactId>servlet-api</artifactId>
                <groupId>javax.servlet</groupId>
            </exclusion>
        </exclusions>
    </dependency>

행운을 빕니다.

STS를 사용하여 Groovy 라이브러리를 프로젝트에 추가한 경우(프로젝트 속성 -> Java 빌드 경로 -> 라이브러리) "아니오, groovy-all만 포함" 옵션을 선택해야 합니다."Yes, include groovy-all and bsf.jar ..., servlet-2.4.jar"의 다른 옵션은 내장된 Tomcat8 클래스와 경합하는 servlet-2.4.jar를 추가합니다.

Jetty를 프로젝트에 사용하고 있는데 같은 오류가 발생했습니다.빠른 해결책은 Maven 의존 관계에서 Embedded Tomcat을 제외하는 것이었습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-ws</artifactId>
    <version>1.2.0.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

mvn dependency:tree공개하지 않았다servlet-api.jar클래스 경로에서 프로젝트(Eclipse에서)를 오른쪽 클릭하여 빌드 경로 / 빌드 경로 구성(Configure Build Path)으로 이동하면 기본 작업 공간 JRE, JDK 1.7.0_51에 해당 jar가 포함되어 있음을 알 수 있습니다.jre/lib/ext디렉토리(적어도 인스톨에서는).클래스 패스에서 삭제하려고 했지만 실패했습니다.@Pedro의 Tomcat 버전을 7로 강제 적용하는 솔루션이 작동했습니다.Java 7의 최신 버전인 JDK 1.7.0_79도 설치했습니다.

저도 이 오류에 직면했습니다.Maven/Spring MVC/Spring Boot 프로젝트가 있습니다.IDE로 IntelliJ를 사용하고 있는데 POM.xml에 새로운 종속성을 추가할 때마다 IDE가 .iml 파일을 변경합니다(예상대로). 그런데 이상한 점은 다음 행을 파일 맨 위로 이동한다는 것입니다.

<orderEntry type="library" name="Java EE 6-Java EE 6" level="project" />

이 경우 프로젝트가 컴파일되지 않고 다음과 같은 오류가 발생합니다.

java.displaces를 클릭합니다.No Such Method Error: javax.servlet.ServletContext.getVirtualServerName() Ljava/lang/String;

orderEntry for Java EE를 다시 맨 아래로 이동하기만 하면 오류가 사라지며 다시 컴파일할 수 있습니다.

빠른 해결을 위해 lib에서 servlet-api.jar를 수동으로 삭제하고 어플리케이션을 빌드하면 동작합니다.그러나 이상적으로는 Kumetix의 제안대로 Classpath에 로드되는 의존관계까지 자세히 조사해야 합니다.

제게는 이것이 해결책이었습니다.

https://mkyong.com/java/servlet-api-2-5-jar-jar-not-loaded/

pom.xml에 servlet-api 의존관계 추가

언급URL : https://stackoverflow.com/questions/24080541/getting-nosuchmethoderror-javax-servlet-servletcontext-addservlet-in-spring-boo

반응형