JSTL을 설치하는 방법? 절대 URI : http://java.sun.com/jstl/core를 해결할 수 없습니다


134

내가 잘못한 일을 모르겠지만 JSTL을 포함시킬 수 없습니다. jstl-1.2.jar이 있지만 불행히도 예외가 발생합니다.

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:315)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:492)
    at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1439)
    at org.apache.jasper.compiler.Parser.parse(Parser.java:137)
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:170)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)

나는 가지고있다:

  • pom.xml

    <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>
    
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    
  • web.xml

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      version="2.5">
    
  • index.jsp

    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <html> 
    <head></head>
    <body></body>
    </html>
    

4
나는 jstl 옆에 taglibs depdendency를 추가해야했고 방금 작동했습니다.
Christian Vielma

답변:


193

org.apache.jasper.JasperException : 절대 URI : http://java.sun.com/jstl/core 는 web.xml 또는이 응용 프로그램과 함께 배포 된 jar 파일에서 확인할 수 없습니다.

이 URI는 JSTL 1.0 용이지만 실제로 추가 /jsp경로 를 사용하여 URI를 사용하는 JSTL 1.2를 사용하고 있습니다 (EL 표현식을 발명 한 JSTL은 버전 1.1 이후 JSP의 일부로 통합되어 EL 로직을 공유 / 재사용하기 때문입니다). 일반 JSP도).

따라서 JSTL 문서를 기반으로 taglib URI를 수정하십시오 .

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

또한 당신은 할 필요가 절대적으로 확신 당신이 함께 런타임 클래스 경로에 여러 다른 버전 화 JSTL JAR 파일을 던져하지 않습니다. 이것은 Tomcat 사용자들에게는 매우 일반적인 실수입니다. Tomcat의 문제점은 JSTL을 기본 제공하지 않으므로 수동으로 설치해야한다는 것입니다. 일반적인 Java EE 서버에서는 필요하지 않습니다. Java EE 란 정확히 무엇입니까?를 참조하십시오 .

특정 경우에, pom.xml은 기본적으로 jstl-1.2.jar와 standard-1.1.2.jar가 있음을 알려줍니다. 이것은 잘못이다. 기본적으로 Oracle의 JSTL 1.2 API + impl과 Apache의 JSTL 1.1 impl을 혼합합니다. 를 제거 해야 합니다 standard-xxx.jar. 그냥 단지jstl-1.2.jar충분하다.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Maven이 아닌 사용자는 웹 애플리케이션 프로젝트의 폴더에 실제 jstl-1.2.jar 파일을 놓아서 동일한 결과를 얻을 수 있습니다 /WEB-INF/lib( standard.jar 또는 느슨한 .tld 파일 은 절대 놓지 마십시오 !). 필요한 경우 제거하십시오.

Tomcat, Jetty 등과 같은 베어 본 서블릿 컨테이너 대신 WildFly, Payara 등과 같은 일반적인 Java EE 서버를 실제로 사용하는 경우 JSTL을 명시 적으로 설치할 필요가 없습니다. 일반적인 Java EE 서버는 이미 기본적으로 JSTL을 제공합니다. 즉, pom.xmlwebapp에서 JAR / TLD 파일을 삭제하거나 놓기 위해 JSTL을 추가 할 필요가 없습니다 . 단독 provided범위 자바 EE 좌표는 충분합니다 :

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version><!-- 8.0, 7.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

또한 Servlet 2.3 이상이 아닌 Servlet 2.4 이상을web.xml 준수 하도록 선언해야 합니다. 그렇지 않으면 JSTL 태그 내의 EL 표현식이 작동하지 않습니다. 대상 컨테이너와 일치하는 최고 버전을 선택하고에 위치가 없는지 확인 <!DOCTYPE>하십시오 web.xml. 다음은 Servlet 4.0 (Tomcat 9) 호환 가능 예입니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <!-- Config here. -->

</web-app>

또한보십시오:


/ jsp로 변경했으며 org.apache.jasper.JasperException : 절대 URI : java.sun.com/jsp/jstl/core 는 web.xml에서 해결할 수 없습니다 ....
lukastymo

4
그렇다면 클래스 패스는 엉망입니다. 정리하십시오. maven 이하는 일과 그것이 똑똑한 지 모르겠지만 JSTL 1.2의 경우 taglib이 필요 하지 않습니다standard . 자세한 내용은 태그 정보 페이지를 읽으십시오.
BalusC

4
나는 당신이 구성한 JSTL 위키 페이지를 정말 좋아합니다. 그러나이 질문은 특정 오류 메시지에 대한 Google의 인기 질문이므로 자유롭게 편집하고 "jsp가 아닌"URI는 JSTL 1.0에서 온 것입니다.
kdgregory

2
@ kdgregory : 감사합니다 :)
BalusC

1
Gradle을 사용하는 경우 다음 종속성을 추가하십시오.compile('javax.servlet:jstl:1.2')
benscabbia

36

@BalusC는 완전히 맞습니다. 그러나 여전히이 예외가 발생하면 잘못한 것을 의미합니다. 가장 중요한 정보는 SO JSTL 태그 정보 페이지에 있습니다.

기본적으로이 예외를 처리하기 위해 수행해야 할 작업에 대한 요약입니다.

  1. web.xml에서 서블릿 버전을 확인하십시오. <web-app version="2.5">

  2. 이 서블릿 버전에 대해 JSTL 버전이 지원되는지 확인하십시오. 서블릿 버전 2.5는 JSTL 1.2를 사용 하거나 서블릿 버전 2.4는 JSTL 1.1을 사용합니다.

  3. 서블릿 컨테이너에는 적절한 라이브러리가 있거나 애플리케이션에 수동으로 포함해야합니다. 예를 들어 : JSTL 1.2에는 jstl-1.2.jar이 필요합니다.

Tomcat 5 또는 6 으로 수행 할 작업

WEB-INF / lib 디렉토리 (응용 프로그램에 대해서만 작동) 또는 tomcat / lib (모든 응용 프로그램에 대해 전역 적으로 작동)에 적절한 jar을 포함시켜야합니다.

마지막은 jsp 파일의 taglib입니다. JSTL 1.2의 경우 올바른 것은 다음과 같습니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3
이 질문이 많은 사람들에게 인기가 있음을 알았습니다. 그래서이 문제를 해결하는 방법을 짧은 튜토리얼을 작성하기로 결정한 것입니다
lukastymo

17

이 유형의 오류에 대한 또 다른 이유를 찾았습니다. 내 경우 누군가 누군가 로그 경고 메시지를 피하기 위해 conf/catalina.properties설정 tomcat.util.scan.StandardJarScanFilter.jarsToSkip속성을 설정 *하여 Tomcat의 필요한 스캔을 건너 뜁니다. 이것을 Tomcat 기본값으로 다시 변경하고 건너 뛸 적절한 jar 목록을 추가하면 (jstl-1.2 또는 spring-webmvc 제외) 문제가 해결되었습니다.


예!. 나도. 어떤 점 넣어에서 누군가 (= 자신) tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*catalina.propertiesA의 파일 (오해는?) 톰캣 속도를 시도 할 시간을 시작합니다. 아아!
peterh

다음 스크립트를 사용하여 TLD 및 웹 조각 항아리를 피하는 jarsToSkip 목록을 만듭니다. pastebin.com/3Bfm1u6K
Moreaki

1
jarsToSkip설정 을 변경하지 않으려면 아래에의 jarsToScan설정을 재정의 하는 설정이 있습니다 jarsToSkip. 우리는 추가 결국 taglibs*.jar우리에게 jarsToScan우리의 태그 라이브러리 말하자면 taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.jar.
jabe

1
이것이 나를 위해 일한 대답입니다. 에서 conf/catalina.properties로 변경 tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar하여 tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar수정했습니다.
Gary S.

15
jstl-1.2.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl-1.1.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

또한 종속 항아리를 확인하시기 바랍니다 당신은 추가했는지 javax.servlet.jarjavax.servlet.jsp.jstl-1.2.1.jar당신의 WEB-INF / lib 폴더 나하지. 필자의 경우이 두 가지로 문제가 해결되었습니다.


여기 질문을 좀
봐주시겠습니까?


10
  1. jstl-1.2.jar 다운로드
  2. 이 지시문을 페이지에 추가하십시오. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. JAR 파일을 WEB-INF / lib 폴더에 붙여 넣습니다. 이 작동합니다. (그것은 나를 위해 일했다.)


3

pom.xml의 Maven 종속성이 잘못되었다고 언급했습니다. 그것은해야한다

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

흥미롭게도, maven에서 jstl을 검색 하면 다음에서 찾을 수 있습니다 . mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl/1.2 이 종속성은 어떻게 찾았습니까?
Koray Tugay

3

방금이 문제에 대한 수정 사항을 추가하고 싶었습니다. 왜 이것이 효과가 있었는지 잘 모르겠습니다. 올바른 jstl (1.2) 버전과 올바른 servlet-api (2.5) 버전이 있습니다.

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

이 스레드에서 제안한대로 내 페이지에 올바른 주소가 있습니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

이 문제를 해결 한 것은 jstl 1.2 종속성에 대한 pom의 xml 파일에서 범위 태그를 제거하는 것이 었습니다. 다시 한 번 왜 그것을 고쳤는지 확실하지 않지만 누군가가 복수형에 대한 JPA 및 Hibernate 자습서를 사용하여 봄을 하고이 방법으로 pom 설정이있는 경우를 대비하여 범위 태그를 제거하고 수정되는지 확인하십시오. 내가 말했듯이 그것은 나를 위해 일했다.


2

MAVEN 및 Spring 도구를 완전히 비활성화했습니다. 그리고 환경을 올바르게 작동시키기 위해 다음과 같은 항아리를 추가해야했습니다.

  • spring-aop-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar (이 수정 프로그램을 찾기가 어려웠지만 다른 org.springframework <3.versions>는 작동하지 않았습니다.
  • spring-context-4.0.3.RELEASE.jar
  • spring-core-4.0.3.RELEASE.jar
  • spring-expression-4.0.3.RELEASE.jar
  • spring-web-4.0.3.RELEASE.jar
  • spring-webmvc-4.0.3.RELEASE.jar
  • jstl-1.2.jar

최악의 것은 jstl-api-1.2.jar및 이었다 javax-servlet.jsp.jst-api-1.2.1.jar. 그들은 단지 작동 하지 않았다 .

jstl-1.2.jar 잘 작동했습니다.


1
+1 몇 시간 동안 벽에 머리를 부딪힌 후 jstl-1.2대신 jstl-1.2.1나를 대신 사용 했는데 왜 그런지 모르겠습니다.
avojak

1

스프링 부트를 사용 server.tomcat.additional-tld-skip-patterns=*.jar하는 Application.properties경우


0

이 질문에 대한 모든 답변이 도움이되었지만 후손에 대한 추가 정보를 추가 할 것이라고 생각했습니다.

패키지에 gwt-test-utils가져온 테스트 종속성이 있음이 밝혀졌습니다 gwt-dev. 불행히도 gwt-devJetpath, JSP, JSTL 등의 전체 사본이 포함되어 있으며 클래스 경로의 적절한 패키지보다 앞서 있습니다. 따라서 JSTL 1.2에 대한 적절한 종속성이 있었지만 내부에 1.0 버전을로드합니다 gwt-dev. 불평.

나를위한 솔루션은 테스트 범위로 실행되지 않았으므로 gwt-test-utils런타임에 패키지를 선택하지 않습니다 . gwt-dev다른 방법으로 클래스 경로에서 패키지를 제거하면 문제가 해결되었습니다.


0

Eclipse에서 비슷한 문제가 수정되었습니다.

rightclick on project->Properties->Deployment Assembly->add Maven Dependencies

내 pom.xml을 편집하는 동안 무언가가 전에 그것을 쫓아 냈습니다.

jar 파일, taglib uri 및 web.xml이 모두 필요했습니다.


0

2020 년의 해답

이 질문은 여전히 ​​매우 인기가 있지만 모든 답변은 매우 구식입니다. 모든 Java EE 구성 요소는 다양한 Jakarta 프로젝트로 분리되었으며 JSTL도 다르지 않습니다. 오늘은 올바른 Maven 종속성이 있습니다.

<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>1.2.7</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>1.2.6</version>
</dependency>

예, 버전과 groupId가 일치하지 않지만 프로젝트의 현재 상태 와는 다릅니다 .


예, 그러나 이것은 내 문제를 해결하지는 못하지만 tomcat10에서는 두 개의 라이브러리가 필요합니다 * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar이 lib는 tomcat10 샘플 webapps에서 검색 할 수 있습니다. tld 파일이 있으므로 taglibs-standard *를 스캔하지 마십시오. 이것은 webapp의 context.xml에서 비활성화 할 수 있습니다. META-CONF lib
Jasonw


-1

나는 같은 문제가 있었고 다른 사람들이 같은 문제를 겪을 경우를 대비하여 일식을 사용하고 있습니다
. 일식에서 바람둥이 서버를 두 번 클릭하고 서버를
중지하십시오 .
"게시하지 않고 서버 모듈"을
시작하면 서버가 시작됩니다.

여기에 이미지 설명을 입력하십시오


-2

다음을 선택하여 IBM RAD 7.5에서 유사한 문제점을 해결했습니다.

  1. 프로젝트 속성
  2. 프로젝트 패싯
  3. JSTL 확인란
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.