Como instalar o JSTL? O uri absoluto: http://java.sun.com/jstl/core não pode ser resolvido

134

Não sei o que fiz incorretamente, mas não posso incluir o JSTL. Eu tenho o jstl-1.2.jar, mas infelizmente recebo a exceção:

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)

Eu tenho:

  • 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>
    
lukastymo
fonte
4
Eu tive que adicionar a dependência do taglibs também ao lado do jstl e apenas funcionou.
Christian Vielma

Respostas:

193

org.apache.jasper.JasperException: a URL absoluta: http://java.sun.com/jstl/core não pode ser resolvida no web.xml ou nos arquivos jar implementados com este aplicativo

Esse URI é para o JSTL 1.0, mas na verdade você está usando o JSTL 1.2, que usa URIs com um /jspcaminho adicional (porque o JSTL, que inventou as expressões EL, desde a versão 1.1 foi integrado como parte do JSP para compartilhar / reutilizar a lógica do EL JSP simples também).

Portanto, corrija o URI taglib adequadamente com base na documentação JSTL :

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

Além disso, você precisa ter certeza absoluta de que não lança vários arquivos JSTL JAR com versão diferentes juntos no caminho de classe de tempo de execução. Este é um erro bastante comum entre os usuários do Tomcat. O problema com o Tomcat é que ele não oferece JSTL pronto para uso e, portanto, você deve instalá-lo manualmente. Isso não é necessário em servidores Java EE normais. Consulte também O que exatamente é o Java EE?

No seu caso específico, seu pom.xml basicamente informa que você possui o jstl-1.2.jar e o standard-1.1.2.jar juntos. Isto está errado. Você está basicamente misturando o JSTL 1.2 API + impl do Oracle com o JSTL 1.1 impl do Apache. Você precisa remover qualquer standard-xxx.jar. Apenas apenas o jstl-1.2.jaré suficiente.

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

Os usuários não-Maven pode conseguir o mesmo largando o físico jstl-1.2.jar arquivo na /WEB-INF/libpasta do projeto de aplicativo web (que absolutamente não cair standard.jar ou quaisquer arquivos .TLD soltos lá dentro!). Remova-os se necessário.

Caso você esteja realmente usando um servidor Java EE normal, como WildFly, Payara, etc, em vez de um contêiner de servlet barebones como Tomcat, Jetty, etc, não será necessário instalar explicitamente o JSTL. Servidores Java EE normais já fornecem JSTL imediatamente. Em outras palavras, você não precisa adicionar JSTL pom.xmlnem soltar nenhum arquivo JAR / TLD no aplicativo da web. Somente a providedcoordenada Java EE com escopo definido é suficiente:

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

Além disso, você também deve se certificar de que o seu web.xmlé declarado em conformidade com pelo menos o Servlet 2.4 e, portanto, não como o Servlet 2.3 ou mais antigo. Caso contrário, as expressões EL dentro das tags JSTL, por sua vez, não funcionarão. Escolha a versão mais alta que corresponde ao seu contêiner de destino e verifique se você não tem nenhum <!DOCTYPE>lugar no seu web.xml. Aqui está um exemplo compatível com 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>

Veja também:

BalusC
fonte
Alterei
4
Então seu caminho de classe está uma bagunça. Limpe-o. Não sei o que o maven está fazendo e se é inteligente, mas para o JSTL 1.2, você não precisa do standardtaglib. Leia a página de informações da tag para obter mais detalhes.
BalusC
4
Eu realmente gosto da página wiki do JSTL que você montou. No entanto, como essa pergunta é a principal ocorrência do Google para a mensagem de erro específica, tomo a liberdade de editá-la e observe que o URI "non-jsp" é do JSTL 1.0.
Kdgregory
2
@kdgregory: Thank you :)
BalusC
1
se você estiver usando Gradle, adicione esta dependência:compile('javax.servlet:jstl:1.2')
benscabbia 22/02
36

@BalusC está completamente certo, mas Se você ainda encontrar essa exceção, significa que algo que você fez de errado. As informações mais importantes que você encontrará estão na página Informações da tag SO JSTL .

Basicamente, este é um resumo do que você precisa fazer para lidar com essa exceção.

  1. Verifique a versão do servlet em web.xml: <web-app version="2.5">

  2. Verifique se a versão JSTL é suportada para esta versão do servlet: A versão 2.5 do servlet usa JSTL 1.2 ou a versão 2.4 do Servlet usa JSTL 1.1

  3. Seu contêiner de servlet deve ter a biblioteca apropriada ou você deve incluí-lo manualmente em seu aplicativo. Por exemplo: JSTL 1.2 requer jstl-1.2.jar

O que fazer com o Tomcat 5 ou 6:

Você precisa incluir jar (es) apropriados no diretório WEB-INF / lib (ele funcionará apenas para o seu aplicativo) ou no tomcat / lib (funcionará globalmente para todos os aplicativos).

A última coisa é um taglib em seus arquivos jsp. Para o JSTL 1.2, um correto é este:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
lukastymo
fonte
3
Percebi que essa pergunta é bastante popular (muitos espectadores). Então é por isso que eu tinha decidido escrever tutorial curto como lidar com este problema
lukastymo
17

Encontrei outro motivo para esse tipo de erro: no meu caso, alguém configurou a propriedade de conf/catalina.propertiesconfiguração para evitar mensagens de aviso de log, ignorando a verificação necessária pelo Tomcat. Mudar isso de volta para o padrão do Tomcat e adicionar uma lista apropriada de jars para ignorar (não incluindo jstl-1.2 ou spring-webmvc) resolveu o problema.tomcat.util.scan.StandardJarScanFilter.jarsToSkip*

resnbl
fonte
Sim!. Eu também. Alguém (= eu) em algum momento colocar tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* em catalina.propertiesarquivo em um (incompreendido?) Tentar acelerar Tomcat tempo de arranque. Arghh!
peterh 11/09/16
Eu uso o script a seguir para criar uma lista jarsToSkip que evita TLDs e frascos de fragmento da Web: pastebin.com/3Bfm1u6K
Moreaki
1
Se você não deseja alterar sua jarsToSkipconfiguração, abaixo dela há uma jarsToScanconfiguração que substitui qualquer coisa jarsToSkip. Acabamos adicionando taglibs*.jarao nosso jarsToScancomo nossos taglibs eram taglibs-standard-impl-1.2.5.jare taglibs-standard-spec-1.2.5.jar.
Jabe
1
Esta é a resposta que funcionou para mim. Em conf/catalina.properties, mudei tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jarpara tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jare isso foi corrigido.
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" %>

também verifique os jars de dependência que você adicionou javax.servlet.jare javax.servlet.jsp.jstl-1.2.1.jarou não na sua pasta WEB-INF / lib. No meu caso, esses dois resolveram o problema.

streethawk
fonte
por favor você pode ter um olhar para a questão aqui [ stackoverflow.com/questions/44039706/...
Kasun Siyambalapitiya
10

Adicione o jstl-1.2.jarna tomcat/libpasta.

Com isso, seu erro de dependência será corrigido novamente.

Hadi Rasouli
fonte
10
  1. Jstl-1.2.jar download grátis
  2. Adicione esta diretiva à sua página: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. Cole o arquivo JAR na sua pasta WEB-INF / lib. Isso deve funcionar. (Funcionou para mim.)

Prashant Ghimire
fonte
3

Mencionei que a dependência do Maven no pom.xml está errada. Deveria ser

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
LoBo
fonte
Interessante, quando procuro jstl no maven, me encontro em: mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl/1.2 Como você encontrou essa dependência?
precisa saber é o seguinte
3

Eu só queria adicionar a correção que encontrei para esse problema. Não sei por que isso funcionou. Eu tinha a versão correta do jstl (1.2) e também a versão correta do 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>

Eu também tinha o endereço correto na minha página, conforme sugerido neste tópico, que é

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

O que corrigiu esse problema para mim foi remover a tag scope do meu arquivo xml no pom da minha dependência do jstl 1.2. Novamente, não sei por que isso foi corrigido, mas apenas no caso de alguém estar iniciando a primavera com o tutorial JPA e Hibernate no pluralsight e ter seu pom configurado dessa maneira, tente remover a tag scope e veja se isso a corrige. Como eu disse, funcionou para mim.

gnattyp
fonte
2

Desabilitei as ferramentas MAVEN e Spring completamente. E eu tive que adicionar o seguinte jar para fazer meu ambiente funcionar corretamente.

  • spring-aop-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar (difícil encontrar essa correção, outras estruturas org.spring <3.versions> simplesmente não funcionavam.
  • 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

O pior de tudo foi jstl-api-1.2.jar e javax-servlet.jsp.jst-api-1.2.1.jar. Eles simplesmente não funcionaram.

jstl-1.2.jar funcionou bem.

Siddharth
fonte
1
+1 Depois de bater minha cabeça contra a parede por horas, usar em jstl-1.2vez de jstl-1.2.1trabalhar para mim também, e não faço ideia do porquê.
Avojak 13/03/19
1

Se você usa o Spring boot, considere remover server.tomcat.additional-tld-skip-patterns=*.jarde Application.propertiesse houver algum

Askar
fonte
0

Todas as respostas nesta pergunta me ajudaram, mas pensei em adicionar algumas informações adicionais para a posteridade.

Aconteceu que eu tinha uma dependência de teste na gwt-test-utilsqual trouxe o gwt-devpacote. Infelizmente, gwt-devcontém uma cópia completa do Jetty, JSP, JSTL etc., que estava à frente dos pacotes apropriados no caminho de classe. Portanto, embora eu tivesse dependências adequadas no JSTL 1.2, ele carregaria a versão 1.0 interna paragwt-dev . Resmungar.

A solução para mim foi não executar com escopo de teste para não pegar o gwt-test-utilspacote no tempo de execução. Remover o gwt-devpacote do caminho de classe de alguma outra maneira também teria corrigido o problema.

cinzento
fonte
0

Só tive problema semelhante no Eclipse corrigido com:

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

algo começou antes, enquanto eu estava editando meu pom.xml

Eu tinha todos os arquivos jar necessários, taglib uri e web.xml estava ok

w3Charlie
fonte
0

Uma resposta para o ano 2020

A pergunta ainda é muito popular, mas todas as respostas estão seriamente desatualizadas. Todos os componentes do Java EE foram divididos em vários projetos de Jacarta e o JSTL não é diferente. Então, aqui estão as dependências corretas do Maven a partir de hoje:

<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>

Sim, as versões e groupIds não correspondem, mas isso é uma peculiaridade do estado atual do projeto .

JohnEye
fonte
sim, mas isso não resolve o meu problema, mas feche, com o tomcat10, você precisa de duas bibliotecas * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar esta lib pode ser recuperada a partir de webapps de exemplo tomcat10 e também não verifica taglibs-padrão *, pois os arquivos tld estão lá, isso pode ser desativado em context.xml no webapp META-CONF lib
Jasonw
-1

Isso funcionou para mim

    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
Ajay Kumar Sinha
fonte
-1

Eu tive o mesmo problema, estou usando o eclipse, caso outros tenham o mesmo problema:
No eclipse, clique duas vezes no servidor tomcat,
pare o servidor e
desmarque os "módulos do servidor sem publicar" e
inicie o servidor.

insira a descrição da imagem aqui

JavaSheriff
fonte
-2

Resolvido problema semelhante no IBM RAD 7.5, selecionando:

  1. Propriedades dos projetos
  2. Facetas do projeto
  3. Caixa de seleção JSTL
c. hantzis
fonte