我有以下的依赖性在我的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>
但是提供的范围,测试范围运行时,增加了在这个依赖到classpath的类,那是码头的一个问题,我开始编程。 因为它已经在其图书馆中,我得到一个
java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package
如果我删除此依赖Jetty服务器在测试范围内可以正常启动,但我需要这种依赖的IntelliJ编译我的代码。 最新最好的方式来解决这个问题,是有办法,我可以排除这种相关性的测试范围是什么?
我只是有这个问题我自己,并希望分享:
- 依赖于
javax.servlet:servlet-api:3.0-alpha-1
具有范围provided
,使得其不与我的WAR最终部署到容器干扰 - 依赖于
org.eclipse.jetty:jetty-webapp
,有范围test
,这样我就可以运行Jetty服务器作为我的单元测试部分 - 随后在一传递依赖
org.eclipse.jetty.orbit:javax.servlet:3.0.0.v201112011016
,通过在需要jetty-webapp
排除jetty.orbit:javax.servlet
没有选项(对我来说),因为码头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
,它八九不离十感觉是在码头的实现相同的优选依赖。
编辑:
顺便说一句,这个问题得到了由我介绍了与自动格式化POM文件的插件的配置摆弄。 它重新排序的依赖性,因此对作品另一个海报的解决方案来重新排序POM文件。 在我的广袤Maven的经验:如果你是你依赖的顺序上的“依赖”,这是一个重大的气味 。
对我来说,同样的错误来了。 我发现旧版本的Servlet(2.5)在我的路径存在使用Servlet 3.0一起。 一旦我删除(排除)老版我的问题解决了。
我找到了解决办法尽量不包括在运行JUnit测试类路径的javax.servlet-API时。 其实我感动的servlet-API在类路径和启示罐子的尽头传来......
我用servlet的API的版本错误。 我用的是2.5,但需要3.0。 Maven的范围我选择“设置”。 适用于在Eclipse和“MVN测试”的执行运行JUnit。
不过,我不明白为什么没有冲突。 如果我这样做是正确甚至是“提供”的依赖将在类路径进行测试时被曝光,所以有可能是一个冲突 - 或,当然 - 如果我正好找到用于编译的servlet的API的正确版本和码头的servlet的API,那么就没有冲突。
不管怎么说,这对我的作品。
这里是我的依赖性/ * POM-设置为码头+ Servlet API的:
<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>
我用下面的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"
排除是不够的,在我的情况,但降级的码头7.6.14.v20131031为我工作。
对于摇篮用户,基于Spring WebMVC运行嵌入式web应用与码头的设置适用于以下依存关系:
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'
}