我正在用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>
。