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

met*_*att 14 m2eclipse maven

我正在使用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) - 罐子没装.请参阅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>
Run Code Online (Sandbox Code Playgroud)

这确实阻止了独立的Maven将servlet-api-2.5打包到我的构建中,但m2eclipse并没有这样看.

(这不是一个大问题,因为警告是无害的,我只在IDE内部测试期间看到它,真正的客户不会看到它,但我仍然想知道如何解决它,因为我喜欢清洁和我喜欢知道事情是如何运作的.)

有没有一种正确的方法告诉m2eclipse不要部署这个文件,或告诉Eclipse不要让m2eclipse对哪些依赖项是运行时依赖项有最终决定权?

我找到https://issues.sonatype.org/browse/MNGECLIPSE-1193其中提到

"Maven Dependencies"容器反映了测试编译时间范围,因此它应该具有范围"提供"的依赖项

小智 14

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


rhi*_*nds 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和一般的痛苦. ..


小智 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>
Run Code Online (Sandbox Code Playgroud)

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