升级log4j到log4j2报错:cannot access org.apache.http.annotation.NotThreadSafe
问题与分析
今天把项目的log4j的依赖改成了log4j2的依赖后,发现使用Maven打包时报错如下:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project cbx-core: Compilation failure
[ERROR] cannot access org.apache.http.annotation.NotThreadSafe
[ERROR] class file for org.apache.http.annotation.NotThreadSafe not found
意思很清楚,找不到类NotThreadSafe
。当我把log4j2改回来log4j后重新打包就不再报错,很明显,和log4j2有关。
纳闷的是,我先前独自写了个测试类是没问题的,怎么一到项目里使用就报错了呢?Eclipse里也没有报错,看了下pom的依赖层级,也没发现有什么jar包冲突。百度了下,发现了问题原因。
该问题是因为httpclient和httpcore两个jar包版本不匹配造成的。由于项目里使用了ElasticSearch,需要httpclient等相关的依赖,其中有两个依赖如下:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.5</version>
</dependency>
原本在使用log4j的时候,项目可以正常打包,但当改成log4j2的时候,需要使用到httpcore包中的某个注解,但由于在4.4.5
版本的httpcore中舍弃了一些注解,于是就报错说找不到NotThreadSafe。
根据Apache的jira issue:HDFS-12527来看,里边的comment提到了:
The problem is that the httpclient and httpcore versions are incompatible.
根据comment来看,httpcore是httpclient的依赖,比较合适的版本应该是4.5.2的httpclient和4.4.4的httpcore。
而从pom的依赖层次看,4.5.2的httpclient本身就是依赖了4.4.4版本的httpcore;但由于项目里偏偏引入更高版本的httpcore,平时固然没问题,但一旦导入某些jar包譬如log4j2,就会编译报错。
解决方法
将httpcore的版本改成4.4.4(低于4.4.5即可),重新进行Maven打包操作,结果编译成功,顺利打包。
参考链接
- Error:java: 无法访问org.apache.http.annotation.ThreadSafe 找不到org.apache.http.annotation.ThreadSafe的类文件
- javadoc: error - class file for org.apache.http.annotation.ThreadSafe not found
升级log4j到log4j2报错:cannot access org.apache.http.annotation.NotThreadSafe的更多相关文章
- 启动报错:Access denied for user 'root'@'localhost' (using password:YES)
项目启动报错:Access denied for user 'root'@'localhost' (using password:YES) 原因:root帐户默认不开放远程访问权限,所以需要修改一下相 ...
- 二、Spring Boot 中maven中dependencies所有的jar包都报红,install报错(https://repo.maven.apache.org/maven2): Not authorized , ReasonPhrase:Authorizatio
问题一:现象:打开SpringBoot项目后,所有依赖包都报红色波浪线 1.install报错(https://repo.maven.apache.org/maven2): Not authorize ...
- HBase启动报错:ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
今天进入hbase shell中输入命令报错:ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is no ...
- 解决报错:The import javax.servlet.annotation cannot be resolved
maven项目,引入javax.servlet.annotation.WebServlet的jar包,使用@WebServlet注解来实现对传统web.xml中servlet和url的映射 报错:Th ...
- tomcat关闭时Log4j2报错 Log4j Log4j2-TF-4-Scheduled-1 memory leak
出错信息: 23-Sep-2017 17:43:18.964 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearRefer ...
- Log4j2报错ERROR StatusLogger Unrecognized format specifier
问题 使用maven-shade-plugin或者maven-assembly-plugin插件把项目打成一个可执行JAR包时,如果你引入了log4j2会出现如下问题: ERROR StatusLog ...
- 2019.3.5 控制台输出log4j得有些报错信息
报错内容如下 log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.Sp ...
- 升级xcode8之后出现报错提示,提示swift版本问题
最近Xcode升级了,出现了各种蛋疼的错误提示,今天遇到个导入框架出现了提示Swift版本的问题,具体如下: "Use Legacy Swift Language Version" ...
- Android AS升级3.1 编译报错:The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin.
AndroidStudio升级到3.1后编译报错:The SourceSet ‘instrumentTest’ is not recognized by the Android Gradle Plug ...
随机推荐
- JSOI2004 平衡点 / 吊打XXX
题目描述 有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到地上) ...
- 【Effective C++】构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...
- 利用ES6中的Proxy和Reflect 实现简单的双向数据绑定
利用ES6中的Proxy (代理) 和 Reflect 实现一个简单的双向数据绑定demo. 好像vue3也把 obj.defineProperty() 换成了Proxy+Reflect. 话不多说 ...
- Shell中括号的作用
Shell中括号的作用 作者:Danbo 时间:2015-8-7 单小括号() ①.命令组.括号中的命令将会断开一个子Shell顺序执行,所以括号中的变量不能被脚本余下的部分使用.括号中多个命令之间用 ...
- IPFS中文简介
ipfs是什么? 它是一个协议也是一个网络,已经运行了2年半,并非虚无缥缈的空气. 它像比特币网络一样,并没有发明什么新技术,他只是将很多种技术(P2P网络技术,bt传输技术,Git版本控制,自证明文 ...
- java中的异常The given object has a null identifier
修改页面点击提交时报如下异常: org.hibernate.TransientObjectException: The given object has a null identifier: com. ...
- MakeFile 文件的使用
什么是Makefile? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...
- 从MySQL获取数据
安装 PM> install-package newtonsoft.json PM> install-package mysql.data string connectionString ...
- centos7使用ceph-deploy部署ceph
准备阶段 准备yum源 删除默认的源,国外的比较慢 yum clean all rm -rf /etc/yum.repos.d/*.repo 下载阿里云的base源 wget -O /etc/yum. ...
- CF-796C
C. Bank Hacking time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...