Maven:我为什么要使用servlet-api-2.5



我正在用Maven创建一个web应用程序,但我遇到了一个问题——出于某种原因,我包含了servlet-api-2.5.jar,这会产生奇怪的异常。从WAR档案中删除这个文件可以解决所有问题,但我正试图理解为什么它会在那里。完整pom.xml文件中的依赖项是:

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

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"

编辑:我更新到了Maven 3.3.9,仍然得到了完全相同的结果。唯一的区别是依赖树显示了各种apache标签库之间的依赖关系,但仍然没有提到servlet-api-2.5。

我无法根据您提供的信息重现您的问题,所以根本原因一定在其他地方。

当从命令行运行mvn package时,您是否看到了额外的servlet JAR,或者这可能是IDE的一个奇怪效果?

如果问题仍然存在,请尝试将您的应用程序减少到最低限度,并创建一个独立的项目,例如在GitHub上,人们可以查看。

顺便说一下,决不能在WEB-INF/lib中包含servletneneneba API(不能两次,甚至不能一次)。始终将Maven范围provided用于servlet API。

通常情况下,项目中存在依赖servlet apî.jar的依赖项。
Maven的默认行为是,我将尝试导入您的依赖项+导入的依赖项的依赖项。如果你想排除一个特定的"子依赖项",你可以给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>

罪魁祸首是源的WEB-INF中的lib/classes/文件夹,其中包含包含的jar。文件夹是由于pom配置错误而创建的(请参阅下文)。在运行Maven时启用Maven调试输出(mvn -X)后,情况是可见的。

删除这些文件夹解决了我所有的问题。

编辑:在再次获得相同的文件夹后,我找到了原因的根源——我使用了<webappDirectory>,而我本应该使用<warSourceDirectory>

相关内容

  • 没有找到相关文章

最新更新