해결된 질문
작성
·
1.4K
·
수정됨
2
members.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>member list</title>
<meta charset="UTF-8">
</head>
<body>
<a href="/index.html">메인</a>
<table>
<thead>
<tr>
<th>id</th>
<th>username</th>
<th>age</th>
</tr>
</thead>
<tbody>
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</head>
</html>
build.gradle
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok:1.18.28'
annotationProcessor 'org.projectlombok:lombok:1.18.28'
//providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//JSP 추가
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' //스프링부트 3.0 이상
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0' //스프링부트 3.0 이상
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.1' //Error 스프링부트 3.0 이상
}
test {
useJUnitPlatform()
}
안녕하세요. spring boot 3 에서 jstl 사용을 위해 gradle에 위 내용처럼 추가하였는데
NoClassDef Err 발생합니다.
2024-01-29 15:07:48.054 ERROR 9200 --- [nio-8080-exec-4] a.c.c.C.[.[.[.[frontControllerServletV1] : Servlet.service() for servlet [frontControllerServletV1] in context with path [] threw exception [java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator] with root cause
java.lang.ClassNotFoundException: jakarta.servlet.jsp.tagext.TagLibraryValidator
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012) ~[na:na]
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[na:na]
프로젝트 클린, gradle refresh 다해봤는데 안되네요
답변 4
3
안녕하세요. developer_BackEnd님, 공식 서포터즈 OMG입니다.
올리신 build.gradle을 보면 스프링 부트 3버전이 아닌 2버전(강의와 동일한 버전)으로 보입니다.
스프링부트 2.x대를 스프링 부트 프로젝트 생성하는 사이트에서 생성할 수 없는 현 시점에서 2.4.3 버전으로 되어있다면 과거에 생성한 프로젝트거나 프로젝트 생성은 현재 생성가능한 3.2.x 버전을 선택하고 바꾸셨을 것으로 생각합니다.
(생성한 패키지 명도 강의와 동일한 hello가 아닌 org.example인 기본 이름인 것으로 보아 강의에서 제공해드리는 프로젝트 코드는 아닌 것 같네요)
프로젝트 생성과 관련하여서는 위에서 답변드린 것처럼 예상하고 있으며
올리신 build.gradle을 보면 스프링 부트 2.4.3버전이 명시되어 있는데 스프링 부트 3.x대 설정을 적용하여 정상동작하지 않는 것 같습니다.
아래의 세팅이 강의 진행에 있어 강의 진행버전과 맞는 (호환되는) build.gradle이므로 강의와 동일하게 맞춰서 확인해보셔야 할 것 같습니다.
스프링 부트 2.x로 진행에 문제가 없었다면 강의에서 제공해드리는 프로젝트 코드를 실행하여 확인해보시는 것도 좋은 방안이며, 설정에 불필요한 시간 소요를 희망하지 않는다면 강의 프로젝트 코드에서 앞서 수강한 내용의 자바 코드 & jsp 코드를 제거하고 강의를 수강하신다면 세팅 이슈를 해결한 채 진행할 수 있습니다.
감사합니다.
1
1
1
안녕하세요, 인프런 AI 인턴입니다.
sangjun_lee1님, 회원 목록을 보는 페이지에서 발생하는 java.lang.NoClassDefFoundError
관련 에러를 해결하고자 하시는군요. 스프링 부트 3.0에서 JSTL 관련 설정으로 인해 문제가 발생하는 경우가 있습니다. 해당 에러는 TagLibraryValidator
클래스를 찾을 수 없어서 발생하는 것으로 보입니다. 이는 JSTL 관련 라이브러리를 찾지 못할 때 발생할 수 있습니다.
이 문제와 유사한 다른 질문에 대한 답변 링크를 찾았습니다. 여기서는 스프링 부트 버전 3.0 이상으로 올라가면서 JSTL 관련 의존성을 새롭게 설정해야 하는 경우가 답변되어 있습니다. javax.*
패키지들이 jakarta.*
으로 변경되어 이를 적용해야 할 수도 있습니다.
다음 링크에서 해결책과 관련 내용을 확인하시고 적용해 보세요:
build.gradle
설정을 제공하고 있습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
해결이 안될 경우 댓글 남겨주세요 😀