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

Tho*_*vik 15 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>
Run Code Online (Sandbox Code Playgroud)

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

 java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package
Run Code Online (Sandbox Code Playgroud)

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

San*_*gen 8

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

  • 依赖于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.我最终这样做了:

  1. 删除依赖 javax.servlet:servlet-api
  2. jetty.orbit:javax.servlet范围内明确添加依赖关系provided,从而完全替换javax.servlet:servlet-api

我不知道HttpConstraintElement它需要的是什么交易; 也许它将在未来的版本中可用javax.servlet:servlet-api,这种感觉更像是对Jetty实现相同的依赖.

编辑:

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


Ram*_*bak 5

尝试将其设置为编译范围