从测试范围Maven中排除servlet-api

时间:2012-06-18 14:22:38

标签: maven-3

我的pom.xml中有以下依赖项,因此我的IDE(IntelliJ)在编译期间具有servlet-api类,但未在构建中提供。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0-alpha-1</version>
    <scope>provided</scope>
 </dependency>

但是当在测试范围内运行时,提供的范围会将此依赖关系中的类添加到类路径中,这对于我以编程方式启动的Jetty来说是一个问题。因为它已经在它的库中了,所以我得到了一个

 java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package

如果我删除了这个依赖项,那么Jetty服务器在测试范围内正确启动,但我需要IntelliJ的这个依赖项来编译我的代码。什么是解决这个问题的最佳方法,有没有办法可以排除测试范围的这种依赖性?

8 个答案:

答案 0 :(得分:7)

我自己就遇到过这个问题并想分享它:

  • 依赖于javax.servlet:servlet-api:3.0-alpha-1,范围为provided,以便它不会干扰我的WAR最终部署到的容器
  • 依赖于org.eclipse.jetty:jetty-webapp,范围为test,以便我可以将Jetty Server作为单元测试的一部分运行
  • 随后org.eclipse.jetty.orbit:javax.servlet:3.0.0.v201112011016
  • 需要对jetty-webapp的传递依赖

排除jetty.orbit:javax.servlet对我来说是没有选择的,因为Jetty Server需要javax.servlet.HttpConstraintElement javax.servlet:servlet-api:3.0-alpha-1不提供的javax.servlet:servlet-api。我最终这样做了:

  1. 删除对jetty.orbit:javax.servlet
  2. 的依赖关系
  3. 明确添加provided的依赖关系,范围为javax.servlet:servlet-api,因此完全取代HttpConstraintElement
  4. 我不知道它需要的javax.servlet:servlet-api是什么交易;也许它将在{{1}}的未来版本中可用,这种感觉更适合Jetty的实现。

    编辑:

    顺便说一句,我通过摆弄自动格式化POM文件的插件配置来引入问题。它重新排序依赖关系,因此反对另一个海报的解决方案来重新排序POM文件。在我丰富的Maven体验中:如果你依赖于依赖的顺序,那就是一种主要的气味

答案 1 :(得分:5)

尝试将其设置为编译范围

答案 2 :(得分:3)

我在尝试不在运行junit测试的类路径中包含javax.servlet-api时找到了解决方案。实际上我把servlet-api移到了类路径的罐子的最末端,并且启发了......

我使用了错误版本的servlet-api。我使用2.5但需要3.0。 Maven范围我选择“提供”。适用于在Eclipse中运行junit和“mvn test”执行。

尽管如此,我不明白为什么没有冲突。如果我做得对,即使“提供的”依赖项将在测试时暴露在类路径中,因此可能存在冲突 - 或者,当然 - 如果我正确地使用用于编译的正确版本的servlet-api和jetty的servlet-api则没有冲突。

无论如何,它对我有用。

这是我对jetty + servlet api的依赖关系/ * pom-setup:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-jsp</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

答案 3 :(得分:3)

对我来说同样的错误来了。我发现我的路径中存在旧版本的Servlet(2.5)以及servlet 3.0。一旦我删除(排除)旧版本,我的问题就解决了。

答案 4 :(得分:1)

我使用以下sbt项目设置来修复类似的问题:

  "any dependency program that includes servlet-api java library code" %  excludeAll ExclusionRule(organization = "org.eclipse.jetty.servlet-api"),
  "org.mortbay.jetty" % "servlet-api" % "3.0.20100224"

答案 5 :(得分:0)

你也可以混合使用灰熊和码头。

答案 6 :(得分:0)

在我的情况下排除不够,但将降级码头降级到7.6.14.v20131031对我有用。

答案 7 :(得分:-1)

对于Gradle用户,运行基于Spring WebMVC的嵌入式Web应用程序的Jetty设置使用以下依赖项:

apply plugin: 'war'
apply plugin: 'jetty'
apply plugin: 'eclipse-wtp'
dependencies {

   // Logging support
   compile 'org.slf4j:slf4j-api:1.7.7'
   runtime 'org.slf4j:slf4j-simple:1.7.7'

   // Spring WebMVC part
   compile 'org.springframework:spring-web:4.0.6.RELEASE'
   compile 'org.springframework:spring-webmvc:4.0.6.RELEASE'
   compile 'org.springframework:spring-context:4.0.6.RELEASE'
   compile 'org.springframework:spring-core:4.0.6.RELEASE'
   compile 'org.springframework:spring-beans:4.0.6.RELEASE'
   compile 'org.springframework:spring-expression:4.0.6.RELEASE'

   // Jetty support
   compile 'org.eclipse.jetty:jetty-server:8.1.4.v20120524'
   compile 'org.eclipse.jetty:jetty-servlet:8.1.4.v20120524'
   compile 'org.eclipse.jetty:jetty-webapp:8.1.4.v20120524'
   compile 'org.eclipse.jetty:jetty-jsp:8.1.4.v20120524'

   // Web Container interaction
   //providedCompile 'javax.servlet:servlet-api:2.5'
   runtime 'jstl:jstl:1.2'

   // Unit Testing
   testCompile 'junit:junit:4.11'
   testCompile 'org.mockito:mockito-all:1.9.5'
   testCompile 'org.springframework:spring-test:3.2.0.RELEASE'
}