【问题标题】:How to add JSTL to Maven?如何将 JSTL 添加到 Maven?
【发布时间】:2011-07-06 02:42:06
【问题描述】:

我正在开发一个使用 Mojarra、PrimeFaces 和 Tomcat 6.x 的 JSF 2.0 项目。

我需要将 c:forEach 用于某些 primefaces 组件,例如 p:tab 的动态数量,但我对 c:forEach 有疑问。 JSTL 的所有其他标记都可以正常工作。

我有以下错误:

java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTagStatus

我使用以下xmlns:c="http://java.sun.com/jsp/jstl/core",我尝试用xmlns:c="http://java.sun.com/jstl/core" 替换,但第二个没有显示。

这是 lib 的确切版本:

<dependency>
    <groupId>javax.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.0.2-FCS</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.0.4-b03</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>2.2.1</version>
</dependency>

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
</dependency>

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>

我该如何解决?

如果需要,我可以提供更具体的信息。

编辑: 我添加并尝试了不同的范围(运行时和编译),但没有任何改变:

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

仓库列表:

  <repositories>
    <repository>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <layout>default</layout>
      <url>http://repo1.maven.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>maven-repository.dev.java.net</id>
      <name>Java.net Repository for Maven 1</name>
      <url>http://download.java.net/maven/1/</url>
      <layout>default</layout>
    </repository>
    <repository>
      <id>maven2</id>
      <name>Java.net Repository for Maven</name>
      <url>http://download.java.net/maven/2</url>
      <layout>default</layout>
    </repository>
    <repository>
      <id>prime-repo</id>
      <name>Prime Technology Maven Repository</name>
      <url>http://repository.prime.com.tr</url>
      <layout>default</layout>
    </repository>
    <repository>
      <id>JBoss2</id>
      <url>https://repository.jboss.org/nexus/content/repositories/public</url>
    </repository>
    <repository>
      <id>JBoss</id>
      <url>http://repository.jboss.com/maven2</url>
    </repository>
    <repository>
      <id>EclipseLink Repo</id>
      <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo</url>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>itextpdf.com</id>
      <name>Maven Repository for iText</name>
      <url>http://maven.itextpdf.com/</url>
    </repository>

    <repository>
      <id>guiceyfruit.release</id>
      <name>GuiceyFruit Release Repository</name>
      <url>http://guiceyfruit.googlecode.com/svn/repo/releases/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
  </repositories>

这是 $TOMCAT_HOME/lib 的内容

annotations-api.jar catalina-ha.jar catalina-tribes.jar el-impl-2.2.jar jasper.jar jsf-api.jar
jsp-api.jar servlet-api.jar
tomcat-dbcp.jar
tomcat-i18n-fr.jar catalina-ant.jar
catalina.jar el-api-2.2.jar
jasper-el.jar jasper-jdt.jar
jsf-impl-2.0.4-b03.jar ojdbc6.jar
tomcat-coyote.jar tomcat-i18n-es.jar tomcat-i18n-ja.jar

【问题讨论】:

  • Tomcat 没有开箱即用的 JSTL。您需要指示您的 Maven 事物添加 JSTL。我改进了标题和标签以吸引合适的人。

标签: maven jstl


【解决方案1】:

您必须在您的发行版中包含 jstl 库。这可以由容器提供,尽管这不是推荐的做法。当前版本的 maven 依赖项(截至撰写时)在这里:

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

尽管如此,检查maven central repository 以获取更新总是值得的。

【讨论】:

  • @HaikalNashuha 通常位于 Maven 项目的根目录。
  • 这可能对一些人有所帮助,对我有所帮助:[maven setup](murraywilliams.com/2011/11/…)
  • 这个线程是旧的,但为源 +1:默认情况下,Tomcat 容器不包含任何 jstl 库。
  • 实际上,jar 根本不需要在 $TOMCAT_HOME/lib 中。您应该随意将它打包到您的网络应用程序的战争中。尽管前后信息不正确,但依赖关系是正确的,因此 -1 表示公牛,并且很好地找到了正确的组 id。
  • @EngineerDollery EngineerDollery 是对的,你能更新答案吗?
【解决方案2】:

正如 Balus 所说,您只需将 JSTL 添加到您的 pom.xml 中,因为 Tomcat 不包含它。 1.2 是最新版本:

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

【讨论】:

  • 它不起作用,可能是我的 pom 中缺少某些东西或有一些冲突?
  • 需要在tomcat lib目录下包含jstl.jar,并使用提供的范围。
  • @LaChamelle 你用的是什么服务器?你是否也包含了标准标签库?
  • 我也收到此错误,将其部署到 weblogic 服务器并且此解决方案不起作用。我也在使用 Maven 进行构建。
【解决方案3】:
<!-- standard.jar --> 
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

<!-- JSTL --> 
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.1.2</version>
</dependency>

然后你可以在你的jsp页面中使用Java标准标签和函数如下:

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

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

这也可以单独使用:

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

【讨论】:

    【解决方案4】:

    我知道这个问题很老,但它在 Google 搜索结果中的排名很高,所以我添加了这个。

    较新的 JSTL 版本(仅)在 org.glassfish.web groupId 下可用。示例:

    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.servlet.jsp.jstl</artifactId>
        <version>1.2.4</version>
    </dependency>
    

    【讨论】:

    【解决方案5】:

    在最近的 Tomcat 版本中使用:

    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-spec</artifactId>
        <version>1.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-impl</artifactId>
        <version>1.2.5</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 2023-03-26
      • 2016-01-16
      • 2013-01-18
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2014-06-30
      相关资源
      最近更新 更多