2011-06-25 50 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

)您可能可以使用''使它成为“提供的“无论如何, –