【发布时间】:2011-08-19 19:41:01
【问题描述】:
我正在使用 Eclipse + Maven + m2eclipse 在 Apache Tomcat 中构建和测试一个 Web 应用程序。
我已经在 Eclipse 中配置了一个 Tomcat 服务器,并为我的 Web 应用程序配置了部署程序集,包括“Maven 依赖项”(Java 构建路径条目的专门化)。
当我部署和启动服务器时,Tomcat/Catalina 总是警告我:
信息:validateJarFile(/projects/src/main/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webapp/WEB-INF/lib/servlet-api-2.5. jar) - jar 未加载。请参阅 Servlet 规范 2.3,第 9.7.2 节。违规类:javax/servlet/Servlet.class
这是因为 m2eclipse 将 servlet-api-2.5 视为我项目的依赖项,并将其视为“Maven 依赖项”的一部分,并将其作为部署程序集的一部分进行复制,但 Tomcat servlet 容器有自己的副本并且不喜欢在类路径上看到 2 个副本。
我已经在我的 pom.xml 中标记了从我的项目到 servlet-api-2.5 的依赖关系
<scope>
provided
</scope>
这确实阻止了独立的 Maven 将 servlet-api-2.5 打包到我的构建中,但 m2eclipse 不这么认为。
(这没什么大不了的,因为警告是无害的,我只在 IDE 内部测试时看到它,真正的客户不会看到它,但我仍然想知道如何修复它,因为我喜欢清洁,我喜欢了解事物的运作方式。)
有没有正确的方法告诉m2eclipse不要部署这个文件,或者告诉Eclipse不要让m2eclipse对哪些依赖是运行时依赖有最终决定权?
我确实找到了提到的https://issues.sonatype.org/browse/MNGECLIPSE-1193
“Maven Dependencies”容器反映了测试编译时范围,因此它应该具有范围为“provided”的依赖项
【问题讨论】:
-
你能展示一下这个项目的 pOM 吗?您是否测试过将范围标签放在一行中?您是否有其他依赖项自己的项目或传递项目?你检查过依赖树吗?
-
@khmarbaise 我已经使用“mvn dependency:tree”检查了依赖树,并且对 servlet-api 的每个引用都提供了范围。 (例如:javax.servlet:servlet-api:jar:2.5:provided(从 2.3 管理的版本;从编译管理的范围))。实际上,我确实在一行中有范围标签,尽管我真的希望没有 xml 解析器会关心这一点。
-
你是如何打包你的战争的?
-
没有战争,只是一堆罐子。这一堆 jar 在 Eclipse 的临时部署目录(.project/metadata/tmp/.../wtpwebapp)中包含 servlet-api-2.5.jar,但在我使用“mvn package”构建时不在我的真实目标目录中。跨度>
-
可能是我的问题不够清楚。您是否 maven build 创建了一个包含正确文件的 war 文件以及如何通过 maven-war-plugin 打包(打包设置为 war?)?