항아리가로드되지 않았습니다. 서블릿 사양 2.3, 섹션 9.7.2를 참조하십시오. 위반 클래스 : javax / servlet / Servlet.class


100

동적 웹 프로젝트이기도 한 Maven 프로젝트를 실행 중입니다. Maven에서 모든 Spring 라이브러리를 사용했습니다. 을 만들었지 web.xml만 Tomcat 7 서버를 시작하면 다음 메시지가 나타납니다.

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

에서 서블릿을 삭제하려고했지만 webapp/lib작동하지 않았습니다. 제 경우에 어떻게해야하는지 알려주세요.


이 동작은 서블릿 사양에 따른 것입니다. 완전히 이해하면 직면 할 수있는 더 까다로운 문제를 이해하는 데 도움이됩니다.
Thorbjørn Ravn Andersen 2015

답변:


113

servlet API .jar 파일은 웹앱에 포함되어서는 안됩니다. 컨테이너는 이미 클래스 경로에 이러한 클래스를 가지고 있기 때문에이 jar에 포함 된 인터페이스를 구현합니다.

종속성은 Maven pom provided의 기본 compile범위가 아닌 범위에 있어야합니다 .

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

"종속성은 Maven pom에서 기본 컴파일 범위가 아닌 제공된 범위에 있어야합니다." 어떻게해야하나요
dreambigcoder 2013 년

내 편집 된 답변을 참조하십시오. Maven을 사용하여 앱을 정리하고 빌드하고 생성 된 webapp의 WEB-INF / lib 디렉토리에 서블릿 jar가 없는지 확인합니다.
JB Nizet 2013 년

나는 모든 것을했다. 아직 WEB-INF / lib 디렉토리에서 jar를 찾고 있습니다. jar를 제거하면 INFO : Starting Servlet Engine : Apache Tomcat / 7.0.12 메시지가 표시됩니다.해야 할 일이 있습니까?
dreambigcoder

6
다른 서블릿 jar 버전에 대한 전 이적 종속성이있는 종속성이있을 수 있습니다. mvn dependency : tree를 사용하여이 서블릿 jar의 출처를 찾고 제외를 추가하십시오.
JB Nizet 2013 년

담쟁이도 어떻게하나요?
Dinesh Babu KG

21

서블릿 api jar 파일이 컨테이너에 이미로드되어 있고 lib디렉토리 에서 다시로드하려고하면이 경고 메시지가 표시됩니다 .

Servlet 사양에 따르면 webapps 디렉토리에 servlet.jar 을 사용할 수 없습니다 lib.

  • 디렉토리 servlet.jar에서 간단히 제거하여 경고 메시지를 제거 하십시오 lib.
  • lib디렉토리 에서 jar를 찾지 못한 경우 빌드 경로를 스캔하고 jar를 제거하십시오.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Maven 프로젝트를 실행하는 경우 컨테이너가 이미 자체 서블릿 jar를 제공 했으므로 pom.xml의 javax.servlet-api범위 provided로 종속성을 변경하십시오 .


4

이를 수정하려면 범위제공됨으로 설정하십시오 . 이것은 Maven이 컴파일 및 테스트를 위해서만 코드 servlet-api.jar를 사용하도록 지시하지만 WAR 파일에는 포함하지 않습니다. 배포 된 컨테이너는 런타임에 servlet-api.jar를 "제공"합니다.

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

2

문제가되는 jar 파일을 추적하는 데 유용한 다음 Windows 명령 줄을 찾을 수 있습니다. 폴더의 모든 jar에있는 모든 클래스 파일의 색인을 생성합니다. 배포 된 앱의 lib 폴더 내에서 실행 한 다음 index.txt 파일에서 문제가되는 클래스를 검색합니다.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt

2

Maven 종속성 범위

제공 :이 훨씬 컴파일처럼,하지만 당신은 나타냅니다 기대 JDK 또는 컨테이너가 런타임에 의존성을 제공 할 수 있습니다. 예를 들어 Java Enterprise Edition 용 웹 애플리케이션을 빌드 할 때 웹 컨테이너가 해당 클래스를 제공 하기 때문에 Servlet API 및 관련 Java EE API 에 대한 종속성을 제공된 범위로 설정 합니다 . 이 범위는 컴파일 및 테스트 클래스 경로에서만 사용할 수 있으며 전 이적이지 않습니다.


1

저는이 문제로 어려움을 겪고 있으며 수많은 "솔루션"을 시도했습니다.

그러나 결국 작동하고 실제로 수행하는 데 몇 초가 걸리는 유일한 방법은 새 서버 인스턴스를 삭제하고 다시 추가하는 것입니다 !

기본적으로 Eclipse에서 Servers 아래의 Tomcat 서버를 마우스 오른쪽 버튼으로 클릭하고 삭제했습니다. 다음으로 새 Tomcat 서버를 추가했습니다. 응용 프로그램을 정리하고 다시 배포하고이 오류를 제거했습니다.


서버-> 정리 ...를 마우스 오른쪽 버튼으로 클릭 한 다음 다시 서버를 마우스 오른쪽 버튼으로 클릭합니다.-> 바람둥이 작업 디렉토리 정리가 저를 위해 수정되었습니다
kiltek

0

다음 디렉토리에서 jar 파일 el-api.jar를 확인하십시오. : C : \ apache-tomcat-7.0.39 \ lib \ el-api.jar이 있으면 웹 응용 프로그램 WEB-INF \ lib \의이 디렉토리에 있습니다. el-api.jar 항아리를 제거해야합니다.


0

URL 패턴이 잘못된 경우이 오류가 발생할 수 있습니다.

예. @WebServlet ( "login")을 작성하면이 오류가 표시됩니다. 올바른 것은 @WebServlet ( "/ login")입니다.


0

제외 및 provided종속성은 하위 프로젝트에서 작동하지 않습니다.

Maven 프로젝트에서 상속을 사용 하는 경우 상위 파일 에이 구성을 포함 해야pom.xml 합니다. 당신은해야합니다 <parent>...</parent>귀하의 pom.xml 섹션에서 상속을 사용하는 경우 . 따라서 부모님에게는 다음과 같은 것이 있습니다 pom.xml.

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

0

JAX-WS 종속성 라이브러리“jaxws-rt.jar”이 누락되었습니다.

여기 http://jax-ws.java.net/로 이동하십시오 . JAX-WS RI 배포판을 다운로드하십시오. 압축을 풀고 "jaxws-rt.jar"를 Tomcat 라이브러리 폴더 "{$ TOMCAT} / lib"에 복사합니다. Tomcat을 다시 시작하십시오.


0

일반적으로이 메시지가 표시되면 무해합니다. 그것이 말한다면

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

그것은 tomcat이 이미 그 jar의 내장 버전을 가지고 있기 때문에 당신의 servlet-api-2.5.jar를 무시한다는 것을 의미합니다. 그래서 그것은 당신의 것을 사용하지 않을 것입니다. 일반적으로 이것은 문제를 일으키지 않습니다.

그러나 그것이 말한다면 WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

그런 다음 할 수있는 작업 (제 경우에는 음영 처리 된 항아리)이 실행됩니다.

$ mvn 종속성 : 트리

그리고 당신이 servlet-api 또는 그와 비슷한 것 (예 :) 인 jar에 의존하는 "something"에 전이적인 의존성을 가지고 있음을 발견하십시오 tomcat-servlet-api-9.0.0. 따라서 귀하의 pom에 제외를 추가하십시오. 예 : (제 경우에는 바람둥이, 귀하의 경우에는 다른 답변에서 언급 한 것입니다) :

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.