我有一个配置有Maven的Web应用程序,该应用程序使用一个库,也配置了Maven,当我将geronimo-servlet_3.0_spec-1.0.jar包包含在WEB-INF / lib中时,我不知道为什么。

我检查与mvn依赖库:树

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


我检查我的网络应用程序:

$ mvn dependency:tree | grep geronimo
$


但是,当我运行mvn:package时,文件将包含在WEB-INF / lib中。

当我运行mvn tomcat:run时,我可以看到:

信息:validateJarFile(/home/stivlo/workspace/private/src/main/webapp/WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar)-未加载jar。参见Servlet Spec 2.3,第9.7.2节。令人反感的类:javax / servlet / Servlet.class

为什么以及如何避免?谢谢。

更新1:根据要求,我添加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>


更新2:我遵循了Stephen 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.说我应该使用


  groupId WAR的artifactId
  包含JAR文件的文件
  您要排除的内容。


我不知道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,则会出现以下错误:


  [错误]无法执行目标
  org.apache.maven.plugins:maven-war-plugin:2.1.1:war
  (default-war)在项目test-webapp上:
  覆盖[id
  org.obliquid.helpers:obliquid-helpers]
  不是项目的依赖项。 ->
  [帮助1]


如果我尝试使用org.obliquid.helpers包含的JAR的groupId和artifactId:

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


我有同样的错误。


  [错误]无法执行目标
  org.apache.maven.plugins:maven-war-plugin:2.1.1:war
  (default-war)在项目test-webapp上:
  覆盖[id
  org.apache.geronimo.specs:geronimo-servlet_3.0_spec]
  不是项目的依赖项。 ->
  [帮助1]


在阅读War插件文档时,我找到了关于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>


[错误]无法在项目test-webapp上执行目标org.apache.maven.plugins:maven-war-plugin:2.1.1:war(默认为war):叠加[id org.obliquid.helpers:obliquid-helpers]不是项目的依赖项。 -> [帮助1]

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


[错误]无法在项目test-webapp上执行目标org.apache.maven.plugins:maven-war-plugin:2.1.1:war(默认为war):覆盖[id org.apache.geronimo.specs:geronimo- servlet_3.0_spec]不是项目的依赖项。 -> [帮助1]

更新4:我发现target / private.war文件不是target / private /目录的zip文件,但是排除是在打包时完成的,而不是通过删除target / private /中的文件进行的-这意味着,我已经重新测试我之前所做的所有事情。


gouki的建议:不起作用,WAR文件中也仍然存在JAR。
斯蒂芬·C(Stephen C.)的建议,可能被误解了:实际上,我只是注意到,不管我把上面解释的三种可能性的groupId / artifactId用作什么,pom.xml始终是无效的。所以他们没有为我工作。
我在文档(packagingExcludes)中找到的内容有效。


现在,如果我必须选择他的答案之一,我会选择Stephen C.,因为他帮助我指出了WAR插件的文档(我在错误的地方阅读)。但是,我会接受一个无效的答案,至少在我尝试过的方式上(可能是错误的)。因此,我不会接受任何答案,而是自己使用最终的工作配置添加新的答案。

更新5:我张贴了obliquid-helpers的pom.xml的相关部分,其中提到geronimo-servlet_3.0_spec。我已将其标记为可选并提供了作用域,除非我在maven-war-plugin配置中将其标记为“ packagingExclude”,否则它仍将包含在Web应用程序中。

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

最佳答案

显然,某些内容与该JAR文件有关。如果它未显示在依赖关系树中,则可能是由于您的webapp WAR文件对另一个具有此依赖关系的WAR文件的依赖所致。

如果是这种情况,那么您可以在WAR文件插件的构建描述符的<excludes>元素中添加<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文件可能仍会徘徊。

09-08 06:38
查看更多