2012-09-05 18 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。