Java 无法使用TestRestTemplate Jar冲突测试Spring Boot Jersey Rest API
任何帮助都将不胜感激。快速回答 对Java 无法使用TestRestTemplate Jar冲突测试Spring Boot Jersey Rest API,java,rest,maven,spring-boot,Java,Rest,Maven,Spring Boot,任何帮助都将不胜感激。快速回答 对pom.xml的快速检查表明,特定的依赖关系org.owasp.esapi:esapi将旧的3.1版本的httpclient拉入。尝试将排除部分添加到此依赖项,如下所述。如果这没有帮助,请相应地遍历依赖关系树 完整答案 在项目根文件夹下运行以下命令 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot
pom.xml
的快速检查表明,特定的依赖关系org.owasp.esapi:esapi
将旧的3.1
版本的httpclient拉入。尝试将排除部分添加到此依赖项,如下所述。如果这没有帮助,请相应地遍历依赖关系树
完整答案
在项目根文件夹下运行以下命令
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<dependencies>
<!-- Spring dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr-complete</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.19.3</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr-complete</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jcs-jcache</artifactId>
<version>2.0-beta-1</version>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.9</version>
</dependency>
<dependency>
<groupId>com.codahale.metrics</groupId>
<artifactId>metrics-healthchecks</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
</dependency>
</dependencies>
这将打印项目的maven依赖关系树,其中包含所有工件id为commons httpclient的拉式可传递依赖关系,例如:
mvn dependency:tree -Dincludes=commons-httpclient
然后,您可以确定出现错误版本的httpclient
的原因(例如,我们的示例是org.owasp.esapi:esapi
),然后您可以通过修改pom.xml隐式排除该可传递依赖项:
[INFO] your:project:jar:1.0-SNAPSHOT
[INFO] \- org.owasp.esapi:esapi:jar:2.1.0:compile
[INFO] \- org.owasp.antisamy:antisamy:jar:1.4.3:compile
[INFO] \- commons-httpclient:commons-httpclient:jar:3.1:compile
甚至可以在没有参数的情况下通过普通树输出调用mvn dependency:tree
最后,您可以显式地向pom.xml添加所需的依赖项,找到并排除错误的版本,如上所述:
mvn dependency:tree -Dincludes=*http*
你能在调用restTemplate并检查/共享控制台输出之前将其放入你的
contextLoads()
中吗?我遵循了你的建议。。。我删除了httpclient的其他传递关系,并按照您的建议显式定义了httpclient。。。但问题依然存在。。同样的错误由于某种原因,依赖项没有被正确下载,这就是为什么maven不能正确地选择排除。请尝试清理本地存储库(注意:它将完全删除maven local repo!),方法是使用mvn dependency:purge local repository
,然后使用mvn clean buld
重新下载JAR。顺便问一下,您是否可以再次检查您的测试类路径是否没有IDE添加的依赖项?也就是说,一些JAR是通过IDE功能导入到您的项目中的,而不是通过maven导入的?有点像全球图书馆之类的我敢肯定。。我已经移除了其他可传递的罐子。。。在依赖关系层次结构中,httpclient过滤器之后只有一个jar-httpclient:4.5.2。我还尝试了一个干净和建设。。。同样的错误检查为“http”筛选的依赖关系树的屏幕截图,我添加了“更新”部分,其中描述了如何将所有测试类路径jar打印到控制台,以便查看哪些httpclient jar实际上已就位。您可以尝试一下并通过共享控制台输出吗?
[INFO] your:project:jar:1.0-SNAPSHOT
[INFO] \- org.owasp.esapi:esapi:jar:2.1.0:compile
[INFO] \- org.owasp.antisamy:antisamy:jar:1.4.3:compile
[INFO] \- commons-httpclient:commons-httpclient:jar:3.1:compile
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.1.0</version>
<!-- change starts here -->
<exclusions>
<exclusion>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
</exclusion>
</exclusions>
<!-- change ends here -->
</dependency>
mvn dependency:tree -Dincludes=*http*
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println(url.getFile());
}