我的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的这个依赖项来编译我的代码。什么是解决这个问题的最佳方法,有没有办法可以排除测试范围的这种依赖性?
答案 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
。我最终这样做了:
jetty.orbit:javax.servlet
provided
的依赖关系,范围为javax.servlet:servlet-api
,因此完全取代HttpConstraintElement
我不知道它需要的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'
}