如何使用eclipse + m2eclipse防止重复的servlet jar

时间:2011-05-06 00:27:23

标签: maven m2eclipse

我正在使用Eclipse + Maven + m2eclipse在Apache Tomcat中构建和测试Web应用程序。

我在Eclipse中配置了Tomcat服务器,并为我的Web应用程序配置了部署程序集,包括“Maven Dependencies”(Java Build Path Entries专业化)。

当我部署并启动服务器时,Tomcat / Catalina总是警告我:

  

INFO: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”容器反映了测试编译时间范围,因此它应该具有范围“提供”的依赖性

5 个答案:

答案 0 :(得分:14)

从更新站点http://m2eclipse.sonatype.org/sites/m2e-extras为m2eclipse插件(“Maven Integration for WTP”)安装额外内容。安装后,更新项目配置。

答案 1 :(得分:5)

我刚遇到类似的问题,并且相信我已经触底了。

如果您转到Eclipse中的服务器配置设置并选择“不发布服务模块”,则不应再出现这种情况。

Maven / M2Eclipse正在构建WAR - servlet-api-2.5.jar不会出现在目标目录或WAR文件中。

但问题是,当您通过eclipse将应用程序部署到您的tomcat时,Eclipse不会将您的maven构建的WAR / target目录用作默认值,它只是为您的项目使用正常的Ec​​lipse“导出”设置。因此,它会在您的“Java EE模块”(或“部署程序集列表”,如果您使用的是Helios)中看到Maven_Dependencies中所有jar的列表,但它不尊重范围,只需部署所有jar。

如果选择不发布选项的服务,那么Eclipst / Tomcat应该直接从目标目录运行应用程序,因此将尊重maven范围。

它不会影响你的实时部署(除非你通过eclipse部署!),因为maven正在做正确的事情,但它有时会导致本地问题,因为你可以导致冲突的servlet / jsp jar,这可能会导致classcastexceptions和一般的痛苦......

答案 2 :(得分:5)

通常,项目中存在依赖于servlet-apî.jar

的依赖项

Maven的默认行为是我将尝试导入您的依赖项+导入的依赖项的依赖项。

如果要排除特定的“子依赖项”,可以为maven提供如下配置:

<dependency>
    <groupId>com.hpsworldwide.mbtrs.switch</groupId>
    <artifactId>YOUR_DEPENDENCY</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后maven将导入YOUR_DEPENDENCY +所有YOUR_DEPENDENCY依赖项,但将从YOUR_DEPENDENCY的依赖项中排除servlet-api。

答案 3 :(得分:4)

如果您使用的是Indigo,可以通过点击“Window”找到WTP插件 - &gt; “偏好” - &gt; “Maven” - &gt; “发现” - &gt; “开放目录”。

答案 4 :(得分:1)

一个提示:安装“Maven Integration for WTP”并更新项目配置后,检查目录/ WEB-INF / lib并删除里面的所有JAR。现在,清理Tomcat工作目录并再次运行。