programing

스프링 부트 java.langNoClassDefFoundError: javax/servlet/Filter

stoneblock 2023. 3. 5. 09:27

스프링 부트 java.langNoClassDefFoundError: javax/servlet/Filter

Spring Boot 1.2.3으로 새로운 프로젝트를 시작했습니다.에러가 납니다.

java.lang.NoClassDefFoundError: javax/servlet/Filter

그라데이션 의존관계:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.codehaus.groovy:groovy")
    compile("com.h2database:h2")
    compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity3")

    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
    testCompile("org.springframework.boot:spring-boot-starter-test")

    compile 'org.webjars:jquery:2.1.4'
    compile 'org.webjars:bootstrap:3.3.4'
}

풀 스택 트레이스를 다음에 나타냅니다.

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Filter
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2570)
    at java.lang.Class.getMethod0(Class.java:2813)
    at java.lang.Class.getMethod(Class.java:1663)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125)
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 29 more

Process finished with exit code 1

maven 사용자의 경우 다음 의존관계에서 제공되는 범위에 대해 코멘트합니다.

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

갱신하다

feed.me에서 언급했듯이, 어떤 앱을 도입하느냐에 따라 제공된 부분을 코멘트 해제해야 합니다.

자세한 내용은 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ #build-build-build-plugins-maven-maven-maven-build를 참조하십시오.

응용 프로그램 종속성의 범위를 변경하는 것은 좋지 않습니다.종속성을 컴파일로 지정하면 일부 설치될 아티팩트에도 종속성이 제공됩니다.가장 좋은 방법은 매뉴얼에 기재되어 있는 대로 지정하여 스핑 부트애플리케이션의 RUN 설정을 설정하는 것입니다.

"'제공' 범위에 종속성 포함" "제공된 범위의 종속성을 런타임 클래스 경로에 추가하려면 이 옵션을 사용합니다."

여기에 이미지 설명 입력

providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

이것은 다음과 같습니다.

compile("org.springframework.boot:spring-boot-starter-tomcat")

IDE(이 경우 IntelliJ)는 다음과 같은 흥미로운 기능을 제공합니다.

  • spring-boot-starter-tomcat제공받은 으로 선언하지 않고 그대로 두면 spring-boot-maven-plugin(SBMP)이 Tomcat의 jars를 전쟁에 투입하여 이 전쟁을 컨테이너에 전개할 때 오류가 발생할 수 있습니다(버전 경합이 발생할 수 있음).

  • 그렇지 않으면 classpath가 complat-embedded의존하지 않고 취득됩니다(SBMP는 제공된 dep를 포함하여 실행 가능한 war/jar를 빌드합니다).

    • intelliJ는 Spring Boot 실행 Configuration을 실행할 때 실행 시 제공된 dep이 표시되지 않습니다(클래스 패스에 없습니다).
    • Tomcat-embedded가 없으면 내장된 서블릿 컨테이너로 Spring-Boot을 실행할 수 없습니다.

몇 가지 까다로운 해결 방법이 있습니다. UI를 통해 Tomcat의 jar를 아이디어 모듈의 클래스 경로에 넣습니다.File->Project Structure->(Libraries or Modules/Dependencies tab).

  • tomcat-module-core
  • tomcat-syslog-el
  • tomcat-flash-web 소켓
  • tomcat-module-module-module

보다 뛰어난 솔루션maven사례.

Idea에서 모듈 의존성을 추가하는 대신 spring-boot-starter-tomcat 라이브러리의 컴파일 범위를 사용하여 maven 프로파일을 선언하는 것이 좋습니다.

<profiles>
    <profile>
        <id>embed-tomcat</id>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

하는 동안에spring-boot-starter-tomcat에 제공되었다고 선언되었다.<dependencies/>IDE 또는 CLI 로 이 프로파일을 액티브하게 합니다( ).mvn -Pembed-tomcat ... Tomcat을 할 수 를 사용하면 임베디드 Tomcat을 사용하여 빌드를 시작할 수 있습니다.

다음 종속성을 추가합니다.스코프가 컴파일되면 동작합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>compile</scope> 
</dependency>

내 경우, 그 의존성의 범위는provided.

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

그래서 저도 같은 문제를 받고 있었어요.원인: java.lang.ClassNotFoundException: javax.servlet.필터

Intelij에서 아래 옵션을 활성화해야 했습니다.

Add dependencies with "provided" scope to classpath

여기에 이미지 설명 입력

다음의 옵션이 유효하게 되어 있는 것을 확인할 수 있습니다.

여기에 이미지 설명 입력

또는

하다에 할 수 있습니다..intellij/workspace.xml참の참 <option name="INCLUDE_PROVIDED_SCOPE" value="true" />

예.,

  <component name="RunManager" selected="Application.DemoApp">
    <configuration name="DemoApp" type="Application" factoryName="Application">
      <option name="INCLUDE_PROVIDED_SCOPE" value="true" /> ```

Jar의 경우

pom.xml 추가

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

것 요.servlet.jar ★★★★★★★★★★★★★★★★★」servlet-api.jar(프로젝트에 /lib/이 라이브러리는 Tomcat에서 이미 제공하고 있습니다.프로젝트 및 클래스 경로에서 제거합니다.프로젝트 또는 클래스 경로에서 검색하여 제거합니다.

다음의 설정이 유효합니다.

configurations {
    customProvidedRuntime
}

dependencies {
    compile(
        // Spring Boot dependencies
    )

    customProvidedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
}

war {
    classpath = files(configurations.runtime.minus(configurations.customProvidedRuntime))
}

springBoot {
    providedConfiguration = "customProvidedRuntime"
}

2022년 솔루션

Tomcat attactId의 maven에서 제공된 제거

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

언급URL : https://stackoverflow.com/questions/30374316/spring-boot-java-lang-noclassdeffounderror-javax-servlet-filter