4

我的设置:jdk 7、Tomcat 7.0.29、Eclipse Juno(嵌入了 m2e[Maven 3.0.4]、m2eclipse-wtp)

我有一个具有此JSTL依赖项的动态 Web 项目:

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

当我mvn package在 Tomcat 上进行部署时,我会在日志中收到这些非致命消息,这些消息不会阻止我的应用程序部署:

validateJarFile(...\WEB-INF\lib\jsp-api-2.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
validateJarFile(...\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

我检查了一下,是的,有问题的 JAR 被打包在 WAR 中。我检查依赖关系mvn dependency:tree并得到这个:

[INFO] \- org.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.1:compile
[INFO]    \- javax.servlet.jsp.jstl:jstl-api:jar:1.2:compile
[INFO]       +- javax.servlet:servlet-api:jar:2.5:compile
[INFO]       \- javax.servlet.jsp:jsp-api:jar:2.1:compile

两个 JAR 都显示在compile范围内,但是如果我检查pom.xmlorg.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.1我会看到:

<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.2</version>
  <scope>provided</scope>
</dependency>

这会在范围内显示它们provided,我认为这会将它们从包装中排除。

问题:

  1. 如何告诉 WAR 插件不包含这些 JAR?<excludes/>不会削减它,因为这也会将它们从构建路径中删除。
  2. 如果我想根据 Servlet 3.0 规范进行开发但保留这个 JSTL 版本怎么办?
4

2 回答 2

2

弄清楚了,jsp-api作为jstl的transative依赖潜入了WEB-INF\lib,解决方法是像这样排除。

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>${javax.jstl.version}</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>jsp-api</artifactId>
            <groupId>javax.servlet.jsp</groupId>
        </exclusion>
    </exclusions>
</dependency>
于 2012-11-17T06:13:13.000 回答
1

对于1.2.1 版,请使用

<!-- add the selvlet-api that tomcat provides as provided -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <exclusions>
         <!-- jstl-api was adding selvlet-api 2.5 and jsp-api-->
        <exclusion>
            <artifactId>jstl-api</artifactId>
            <groupId>javax.servlet.jsp.jstl</groupId>
        </exclusion>
    </exclusions>
</dependency>

因为如果不是,jstl-api 1.2将作为依赖项添加。是 jstl-api 添加了 jsp-api 和 servlet-api 依赖项。

于 2014-06-28T16:06:43.080 回答