2016-03-26 36 views
2

我創建與Maven Web應用程序,和我有一個問題 - 由於某種原因,我得到servlet-api-2.5.jar包括在內,這給了奇怪的例外。從WAR存檔中刪除此文件解決了所有問題,但我試圖瞭解爲什麼它首先出現在那裏。我依賴於完全pom.xml文件是:Maven的:爲什麼我會收到servlet的API-2.5

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.sillyfly.webapp</groupId> 
    <artifactId>Webapp</artifactId> 
    <version>0.1</version> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>7</source> 
        <target>7</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <webXml>web/WEB-INF/web.xml</webXml> 
        <webappDirectory>web</webappDirectory> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.json</artifactId> 
      <version>1.0.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.taglibs</groupId> 
      <artifactId>taglibs-standard-impl</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.taglibs</groupId> 
      <artifactId>taglibs-standard-jstlel</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.taglibs</groupId> 
      <artifactId>taglibs-standard-spec</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.38</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
</project> 

運行mvn dependency:tree -Dverbose產量:

[INFO] Scanning for projects... 
[INFO] Searching repository for plugin with prefix: 'dependency'. 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - org.sillyfly.webapp:Webapp:jar:0.1 
[INFO] task-segment: [dependency:tree] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [dependency:tree {execution: default-cli}] 
[INFO] org.sillyfly.webapp:Webapp:jar:0.1 
[INFO] +- org.glassfish:javax.json:jar:1.0.4:compile 
[INFO] +- org.apache.taglibs:taglibs-standard-impl:jar:1.2.5:compile 
[INFO] +- org.apache.taglibs:taglibs-standard-jstlel:jar:1.2.5:compile 
[INFO] +- org.apache.taglibs:taglibs-standard-spec:jar:1.2.5:compile 
[INFO] +- mysql:mysql-connector-java:jar:5.1.38:compile 
[INFO] \- javax.servlet:javax.servlet-api:jar:3.1.0:compile 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 2 seconds 
[INFO] Finished at: Sat Mar 26 12:12:32 IDT 2016 
[INFO] Final Memory: 24M/515M 
[INFO] ------------------------------------------------------------------------ 

哪裏有沒有提到對servlet-api-2.5.jar。 我現在注意到它說jar而不是war,所以我想我的問題是雙重的: 1. JAR和WAR依賴關係是否不同,如果是的話,如何獲得Maven依賴關係插件來顯示WAR依賴關係? 2.我如何明確告訴Maven 而不是包含servlet-api-2.5.jar?我已經嘗試在各個地方添加排除,但是因爲我不知道爲什麼它首先出現在哪裏,所以它主要是猜測遊戲,在哪裏放置排除,以及我嘗試過的地方都沒有。

mvn --version爲referene:

Apache Maven 2.2.1 (rdebian-23) 
Java version: 1.8.0_72-internal 
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "linux" version: "4.4.0-1-amd64" arch: "amd64" Family: "unix" 

編輯:我更新到3.3.9 Maven的,我仍然得到完全相同的結果。唯一的區別是依賴樹顯示了各種apache taglibs庫之間的依賴關係,但仍然沒有提到servlet-api-2.5。

+0

你試過提供您的javax.servlet依賴放?順便說一下,神器不是 servlet-api? –

+0

如果你是第一個得到它,那麼爲什麼你從第二個地方移除它? –

+0

不,它是[javax.servlet-api](http://search.maven.org/#artifactdetails%7Cjavax.servlet%7Cjavax.servlet-api%7C3.1.0%7Cjar)。將其設置爲「提供」不會改變最終的戰爭。只是要清楚 - 我在戰爭中獲得了2.5 *和* 3.1,而不僅僅是2.5。這只是2.5錯誤,並導致運行時異常。 – Itai

回答

2

我無法從你給的信息重現你的問題,所以根源一定在別處。

你看到額外的servlet JAR從命令行運行mvn package時,或會不會是你的IDE的奇效?

如果問題仍然存在,嘗試將您的應用減少到最低限度,例如創建一個自包含的項目在GitHub上,人們可以看看。

順便說一句,你絕不能包括WEB-INF/lib了servlet API(不是兩次,一次也沒有)。對於servlet API,始終使用Maven範圍provided

+0

出於某種原因,'servlet-api-2.5.jar' *和*'javax.servlet- api-3.1.0.jar'結束於'WEB-INF/lib',即使我給後者'提供'。我正在更新問題以包含完整的'pom.xml'。還有什麼可以影響Maven嗎?該項目最初來自Intellij,但我相信Maven只關心'pom.xml'中的內容,對嗎? – Itai

+0

我從命令行運行'mvn war:war'。運行'mvn package'會創建一個JAR,而不是WAR,並且這個JAR不包含任何庫。 – Itai

+0

@sillyfly使用'mvn war:war'與你的pom放在一起libs javax.json-1.0.4.jar, mysql-connector-java-5.1.38.jar, taglibs-standard-impl-1.2.5.jar , taglibs-standard-jstlel-1.2.5.jar, taglibs-standard-spec-1.2.5.jar在lib文件夾中。沒有其他的。還有其他一些事情必須在這裏發生。 – eis

1

罪魁禍首是lib/classes/文件夾中的源代碼WEB-INF,其中包含所包含的罐子。這些文件夾是由於錯誤的pom配置而創建的(請參閱下文)。在運行Maven時啓用Maven調試輸出(mvn -X)後,情況是可見的。

刪除這些文件夾解決了我所有的問題。

編輯:再次得到相同的文件夾後,我找到了事業的根本 - 我用<webappDirectory>,當我應該用<warSourceDirectory>

1

通常存在這樣取決於servlet的api.jar文件你的項目的依賴。
Maven的默認行爲是我將嘗試導入您的依賴項+導入的依賴項的依賴項。 如果要排除特定的「子依賴性」,你可以給行家這樣的配置:

<dependency> 
    <groupId>com.hpsworldwide.mbtrs.switch</groupId> 
    <artifactId>DEPENDENCY</artifactId> 
    <version>1.0</version> 
    <exclusions> 
     <exclusion> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
相關問題