2011-06-25 55 views
1

我有一個配置了Maven的Web應用程序,它使用一個庫,也使用Maven配置,當我打包geronimo-servlet_3.0_spec-1.0.jar包含在WEB-INF/lib中時,我不明白爲什麼。Maven:部署了javax.servlet規範

我請與MVN依賴庫:樹

$ mvn dependency:tree | grep geronimo 
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_3.0_spec:jar:1.0:provided 

檢查我的web應用程序:

$ mvn dependency:tree | grep geronimo 
$ 

當我運行mvn然而:軟件包的文件被包含在WEB-INF/lib目錄。

當我運行mvn tomcat的:來看,我可以看到:

信息:validateJarFile(/home/stivlo/workspace/private/src/main/webapp/WEB-INF/lib/geronimo-servlet_3.0_spec- 1.0.jar) - jar沒有加載。請參閱Servlet規範2.3,第9.7.2節。違規類:javax/servlet/Servlet.class

爲什麼以及如何避免?謝謝。

UPDATE 1:作爲請求的I添加的pom.xml

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.obliquid</groupId> 
    <artifactId>test-webapp</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>private webapp</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <repositories> 
     <!-- For Jakarta ORO --> 
     <repository> 
      <id>mvnsearch</id> 
      <name>Maven Search</name> 
      <url>http://www.mvnsearch.org/maven2/</url> 
     </repository> 
    </repositories> 

    <dependencies> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.obliquid.helpers</groupId> 
      <artifactId>obliquid-helpers</artifactId> 
      <version>0.9-SNAPSHOT</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.4</version> 
      <scope>provided</scope> 
     </dependency> 

    </dependencies> 

    <build> 
     <finalName>private</finalName> 
    </build> 

</project> 

UPDATE 2:我跟着斯蒂芬C的建議和修改的構建部分如下:

<build> 
    <finalName>private</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war</artifactId> 
      <version>2.1</version> 
      <configuration> 
       <overlays> 
        <overlay> 
         <groupId>org.obliquid</groupId> 
         <artifactId>test-webapp</artifactId> 
         <excludes> 
          <exclude>WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar</exclude> 
         </excludes> 
        </overlay> 
       </overlays> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

但是geronimo * .jar仍然包含在內。我想我在這個配置中犯了一個錯誤。

更新3:斯蒂芬C.說我應該用

the groupId the artifactId of the WAR file that contains the JAR file(s) that you are trying to exclude.

我不知道WAR文件可以有一個groupId和artifactId的,其實在我的pom.xml我不看到任何。我的項目構建了一個WAR文件,並且有一個groupId和一個artifactId,這些都是我上面測試沒有成功的那些。

的依賴造成的問題如下(是JAR,而不是一個WAR):

<dependency> 
    <groupId>org.obliquid.helpers</groupId> 
    <artifactId>obliquid-helpers</artifactId> 
    <version>0.9-SNAPSHOT</version> 
    <scope>compile</scope> 
</dependency> 

如果我嘗試使用groupId和在這種依賴我有以下的錯誤中列出的artifactId:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project test-webapp: overlay [ id org.obliquid.helpers:obliquid-helpers] is not a dependency of the project. -> [Help 1]

如果我嘗試使用groupId和由org.obliquid.helpers包括JAR中的artifactId:

<groupId>org.apache.geronimo.specs</groupId> 
<artifactId>geronimo-servlet_3.0_spec</artifactId>) 

我有同樣的錯誤。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project test-webapp: overlay [ id org.apache.geronimo.specs:geronimo-servlet_3.0_spec] is not a dependency of the project. -> [Help 1]

閱讀戰爭插件文檔,我找到了關於creating skinny WARs的章節。所以我嘗試了以下內容:

<build> 
    <finalName>private</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.1.1</version> 
      <configuration> 
       <packagingExcludes>WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar</packagingExcludes> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

仍然沒有成功,geronimo-servlet_3.0_spec-1.0.jar仍然存在!

<groupId>org.obliquid.helpers</groupId> 
<artifactId>obliquid-helpers</artifactId> 

[錯誤]未能執行目標org.apache.maven.plugins:Maven的戰爭插件:2.1.1:項目測試的webapp戰爭(默認戰):覆蓋[ID org.obliquid .helpers:obliquid-helpers]不是項目的依賴項。 - > [求助1]

<groupId>org.apache.geronimo.specs</groupId> 
<artifactId>geronimo-servlet_3.0_spec</artifactId> 

[錯誤]未能執行目標org.apache.maven.plugins:Maven的戰爭插件:2.1.1:項目測試的webapp戰爭(默認戰):覆蓋[id org.apache.geronimo.specs:geronimo-servlet_3.0_spec]不是項目的依賴項。 - > [Help 1]

UPDATE 4:我發現target/private.war文件不是target/private /目錄的zip文件,但排除是在打包時完成的,而不是通過刪除文件目標/私人/ - 這意味着,我必須重新測試我之前做過的所有事情。

  • gouki建議:不起作用,JAR仍然存在於WAR文件中。
  • Stephen C.的建議,可能是誤解:實際上我只是注意到,pom.xml總是無效的,無論我在上面解釋了三種可能性的groupId/artifactId。所以他們沒有爲我工作。
  • 我在文檔(packagingExcludes)中找到的作品。

現在,如果我不得不選擇他的答案之一,我會選擇Stephen C.,因爲他幫助我指出WAR插件的文檔(我在錯誤的地方閱讀)。不過,我會接受一個不起作用的答案,至少在我嘗試的方式(可能是錯誤的)方面。所以我不打算接受任何答案,並自己添加一個新的答案與最終的工作配置。

UPDATE 5:我發佈了obliquid-helpers的pom.xml的相關部分,它提到了geronimo-servlet_3.0_spec。我已經標記了它是可選的,並且提供了作用域,但它仍然包含在web應用中,除非我在maven-war-plugin配置中將其標記爲「packagingExclude」。

<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.obliquid.helpers</groupId> 
    <artifactId>obliquid-helpers</artifactId> 
    <version>0.9-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <name>obliquid-helpers</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <repositories> 
    [...] 
    </repositories> 

    <dependencies> 
    [...] 

    <dependency> 
     <groupId>org.apache.geronimo.specs</groupId> 
     <artifactId>geronimo-servlet_3.0_spec</artifactId> 
     <version>1.0</version> 
     <scope>provided</scope> 
     <optional>true</optional> 
    </dependency> 

    </dependencies> 

</project> 
+0

你能包括你的pom嗎? – gouki

+0

當然,我將它添加到答案中。 – stivlo

回答

0

首先我要感謝gouki和Stephen C.幫助我。然而,他們提出的解決方案並不適合我。我很感謝他們,但我不能接受他們的回答,因爲這樣做會誤導人,因爲它不適合這個問題。我提出了Stephen C.答案,因爲他向我指出了正確的文件,這對解決問題至關重要。

閱讀WAR插件文檔,特別是war:war mojo部分,我找到了一個關於如何創建瘦的WAR的例子,它實現了訣竅。因此,這裏的工作配置下,被添加到構建部分:

<build> 
    <finalName>private</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.1.1</version> 
      <configuration> 
       <packagingExcludes>WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar</packagingExcludes> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

存檔部分可能不是真正需要的,但我會發現,當我部署WAR。執行該技巧的部分是packagingExcludes標記,它可以包含逗號分隔的標記列表,以在包裝之前從WAR中排除。

+0

我想指出我的建議是基於您使用的假設WAR文件覆蓋...你不這樣做 –

+0

我也認爲你還沒有深入到底層爲什麼JAR文件首先依賴於文件?是/是我在**任何**中提到您的POM文件?它是否在你的POM的家屬的任何POM文件中提到過?你是否在使用一些時髦的插件來添加背後的依賴項?在沒有提及某處的情況下,依賴關係不會被拉進... –

+0

我看到,在提到的問題中,我提到我使用「一個也配置了Maven的庫」,也許我應該也告訴過,它被打包爲JAR ..關於第二條評論:你說得對,我仍然不知道它爲什麼被列入第一位。我發佈了obliquid-helpers的pom.xml – stivlo

1

很明顯,某些東西依賴於該JAR文件。如果它沒有出現在依賴關係樹中,這可能是由於Web應用程序WAR文件依賴於另一個具有此依賴關係的WAR文件。

如果是這種情況,那麼您可以將<excludes>添加到WAR文件插件的構建描述符的<overlay>元素;例如

... 
<build> 
    <finalName>webapp</finalName> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.1</version> 
     <configuration> 
      <overlays> 
      <overlay> 
       <groupId>xxx</groupId> 
       <artifactId>yyy</artifactId> 
       <excludes> 
       <exclude>WEB-INF/lib/whatever.jar</exclude> 
       </excludes> 
      </overlay> 
      </overlays> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    ... 

如果您正在使用WAR文件覆蓋,你應該總是包括在生成的clean目標。否則,您可以在WAR文件中獲得舊的依賴關係。 (IIRC,每當你建立一個沒有清理的重疊WAR時,Maven輸出中會有一個警告!)

事實上,這可能是你問題的根本原因。例如,如果以前您將「geronimo」視爲普通依賴項,並且從那時起您還沒有運行mvn clean,那麼JAR文件仍然可能處於閒置狀態。

+0

謝謝,我已經按照您的建議添加了排除,但geronimo * .jar仍然包含在內。我想我犯了一些錯誤..當你說: xxx yyy,這是否意味着我的web應用程序?我把我的webapp的。 – stivlo

+0

不,我指的是groupId包含您試圖排除的JAR文件的WAR文件的artifactId。閱讀Maven WAR文件插件文檔! –

+0

好的,我已經閱讀了很多關於Maven的文章,但還不夠,你的建議我去了這裏閱讀更多http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html - I嘗試了三種不同的東西,都失敗了 - 在這裏我無法正確格式化文本,我將更新問題。 – stivlo

0

根據您的pom。XML,可能有關於Geronimo的servlet依賴的唯一依賴是

<dependency> 
     <groupId>org.obliquid.helpers</groupId> 
     <artifactId>obliquid-helpers</artifactId> 
     <version>0.9-SNAPSHOT</version> 
     <scope>compile</scope> 
    </dependency> 

你可以嘗試排除這種依賴Geronimo的?

<dependency> 
      <groupId>org.obliquid.helpers</groupId> 
      <artifactId>obliquid-helpers</artifactId> 
      <version>0.9-SNAPSHOT</version> 
      <scope>compile</scope> 
      <exclusions> 
       <exclusion> 
        <groupId>org.apache.geronimo.specs</groupId> 
        <artifactId>geronimo-servlet_3.0_spec</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
+0

是的,就是這樣,奇怪的是標記爲「提供」,這意味着不應該包含在包裝中。現在我嘗試你的解決方案,並讓你知道,謝謝。 – stivlo

+0

我不知道爲什麼,但是即使在依賴項中添加排除,geronimo-servlet_3.0_spec-1.0.jar仍然存在:-( – stivlo

+0

)您可能可以使用''使它成爲「提供的「無論如何, –