我的设置:jdk 7,Tomcat 7.0.29,Eclipse Juno(嵌入m2e[Maven 3.0.4],m2eclipse wtp)
我有一个动态Web项目,它依赖JSTL:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
</dependency>
当我mvn package
并在Tomcat上部署时,我会在日志中收到这些不致命的消息,这些消息不会阻止我的应用程序部署:
validateJarFile(...WEB-INFlibjsp-api-2.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
validateJarFile(...WEB-INFlibservlet-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
范围内,但如果我检查org.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.1
上的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.2</version>
<scope>provided</scope>
</dependency>
显示在provided
作用域上,我认为这会将它们从包装中排除。
问题:
- 如何告诉WAR插件不包括这些JAR?
<excludes/>
不会剪切它,因为这也会将它们从构建路径中删除 - 如果我想针对Servlet 3.0规范进行开发,但保留这个JSTL版本,该怎么办
发现,jsp-api作为jstl的交易依赖项潜入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>
对于版本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 api1.2将作为依赖项添加。正是jstlapi添加了jsp api和servlet api依赖关系。