2012-09-05 21 views
3

我的设置:jdk 7,Tomcat 7.0.29,Eclipse Juno(带m2e [Maven 3.0.4嵌入], m2eclipse的-WTP)修复maven JSTL 1.2.1的依赖关系,所以maven-war-plugin不打包冒犯Tomcat的JAR 7

我有一个动态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-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版本,该怎么办?
+0

我有同样的问题,你知道吗? – ams

回答

2

想通了,jsp-api是偷偷进入WEB-INF \ lib作为jstl的翻译依赖项,修正就是这样排除。

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

我对1.2.1感兴趣 - 这是添加jstl-api作为传递依赖 - 它添加了jsp-api。在这里看到我的解决方案:http://stackoverflow.com/a/24468573/281545 –

+0

此外你的答案让我想起:http://www.murraywilliams.com/2011/11/running-jstl-1-2-on- Tomcat的-7-使用-行家/ –

0

对于版本1.2.1use

<!-- 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将被添加作为一个依赖。它是添加了jsp-api和servlet-api依赖项的jstl-api。