Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven:javax.servlet规范已部署_Java_Tomcat_Maven - Fatal编程技术网

Maven:javax.servlet规范已部署

Maven:javax.servlet规范已部署,java,tomcat,maven,Java,Tomcat,Maven,我用Maven配置了一个web应用程序,它使用一个库,也用Maven配置,当我打包geronimo-servlet_3.0_spec-1.0.jar时,它包含在web-INF/lib中,我不明白为什么 我使用mvn dependency:tree检查库 $ mvn dependency:tree | grep geronimo [INFO] +- org.apache.geronimo.specs:geronimo-servlet_3.0_spec:jar:1.0:provided 我检查我的

我用Maven配置了一个web应用程序,它使用一个库,也用Maven配置,当我打包geronimo-servlet_3.0_spec-1.0.jar时,它包含在web-INF/lib中,我不明白为什么

我使用mvn dependency:tree检查库

$ 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: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规范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>

4.0.0
org.obliquid
. 因此,我尝试了以下方法:

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

私有的
org.apache.maven.plugins
maven战争插件
2.1.1
WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar
仍然没有任何成功,geronimo-servlet_3.0_spec-1.0.jar仍然存在

<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
org.obliquid.helpers
义务帮手
[错误]无法执行目标org.apache.maven.plugins:maven war插件:2.1.1:war(默认war)在项目测试webapp:overlay[id org.obliquid.helpers:obliquid helpers]不是项目的依赖项。->[帮助1]

<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
org.apache.geronimo.specs
geronimo-servlet_3.0_规范
[错误]未能执行目标org.apache.maven。插件:maven-war插件:2.1.1:war(默认war)在项目测试webapp:overlay[id org.apache.geronimo.specs:geronimo-servlet_3.0_spec]上不是项目的依赖项。->[帮助1]

<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
更新4:我发现target/private.war文件不是target/private/目录的zip文件,但排除是在打包时完成的,而不是通过删除target/private/中的文件——这意味着,我必须重新测试我以前做过的所有事情

  • gouki的建议:不起作用,JAR仍然在WAR文件中
  • Stephen C.的建议可能被误解了:事实上,我只是注意到pom.xml总是无效的,不管我在上面解释的三种可能性中使用了什么groupId/artifactId。所以他们没有为我工作
  • 我在文档(PackageExcludes)中找到的东西很有用
现在,如果我必须选择他的答案之一,我会选择Stephen C,因为他帮助我指向WAR插件的文档(我在错误的地方阅读)。然而,我会接受一个不起作用的答案,至少以我尝试的方式(可能是错误的)。所以我不打算接受任何答案,而是自己在最终工作配置中添加一个新答案

更新5:我发布了obliquid helpers的pom.xml的相关部分,其中提到geronimo-servlet_3.0_规范。我已将其标记为可选,并提供了范围,但它仍然被web应用程序包含,除非我在maven war插件配置中将其标记为“PackageExclude”

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

4.0.0
org.obliquid.helpers
义务帮手
0.9-1快照
罐子
义务帮手
http://maven.apache.org
UTF-8
[...]
[...]
org.apache.geronimo.specs
geronimo-servlet_3.0_规范
1
假如
真的

显然,某些东西依赖于该JAR文件。如果它没有显示在依赖项树中,可能是由于您的webapp WAR文件依赖于具有此依赖项的另一个WAR文件

如果是这种情况,那么您可以在WAR文件插件的构建描述符的
元素中添加
;e、 g

...
<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>
  ...
。。。
网络应用
org.apache.maven.plugins
maven战争插件
2.1
xxx
yyy
WEB-INF/lib/whatever.jar
...

如果使用WAR文件覆盖,则应始终在生成中包含
clean
目标。否则,您可能会在WAR文件中挂起旧的依赖项。(IIRC,每次在未清理的情况下构建覆盖WAR时,Maven输出中都会有一条警告!)


事实上,这可能是你问题的根本原因。例如,如果以前您将“geronimo”作为一个普通的依赖项,并且从那时起您就没有运行过
mvnclean
,那么JAR文件可能仍然挂起

显然,有些东西依赖于这个JAR文件。如果它没有显示在依赖项树中,可能是由于您的webapp WAR文件依赖于具有此依赖项的另一个WAR文件

如果是这种情况,那么您可以在WAR文件插件的构建描述符的
元素中添加
;e、 g

...
<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>
  ...
。。。
网络应用
org.apache.maven.plugins
maven战争插件
2.1
xxx
yyy
WEB-INF/lib/whatever.jar
...

如果使用WAR文件覆盖,则应始终在生成中包含
clean
目标。否则,您可能会在WAR文件中挂起旧的依赖项。(IIRC,每次在未清理的情况下构建覆盖WAR时,Maven输出中都会有一条警告!)


事实上,这可能是你问题的根本原因。例如,如果以前您将“geronimo”作为一个普通的依赖项,并且从那时起您就没有运行过
mvnclean
,那么JAR文件可能仍然挂起

根据pom.xml,唯一可能依赖geronimo servlet的依赖项是

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

org.obliquid.helpers
义务帮手
0.9-1快照
编译
 <dependency>
        <groupId>org.obliquid.helpers</groupId>
        <artifactId>obliquid-helpers</artifactId>
        <version>0.9-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
  <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>
<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>