使用Emoji4j触发java.lang.NoSuchFieldError: USE_DEFAULTS错误求助
解决Emoji4j触发的
java.lang.NoSuchFieldError: USE_DEFAULTS错误 这个问题的核心是Jackson依赖版本冲突:Emoji4j内部依赖特定版本的Jackson库,但你的项目中引入的Jackson版本与它所需版本不兼容,导致JsonInclude类中找不到USE_DEFAULTS字段。
问题分析
从错误栈可以看到,错误起源于emoji4j.EmojiManager初始化时创建ObjectMapper,而Jackson的JsonInclude$Value静态初始化时找不到USE_DEFAULTS字段——这个字段是在Jackson 2.8+版本中新增的,如果你的项目使用了更早版本的Jackson,就会触发这个错误。
解决步骤
第一步:确认Emoji4j依赖的Jackson版本
查看Emoji4j的官方依赖说明(或直接查看其pom.xml文件),确认它要求的Jackson版本。比如Emoji4j 0.5.0版本通常依赖Jackson 2.9.x系列。第二步:统一项目中的Jackson版本
在你的项目构建文件(Maven的pom.xml或Gradle的build.gradle)中,强制指定所有Jackson相关依赖的版本,确保与Emoji4j兼容:
比如Maven中可以这样配置:<properties> <jackson.version>2.9.10</jackson.version> </properties> <dependencies> <!-- 统一Jackson依赖版本 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!-- 你的Emoji4j依赖 --> <dependency> <groupId>com.kcthota</groupId> <artifactId>emoji4j</artifactId> <version>0.5.0</version> </dependency> </dependencies>第三步:排除冲突的依赖
如果项目中其他第三方库引入了不兼容的Jackson版本,需要在依赖声明中排除这些冲突的子依赖:
比如Maven中:<dependency> <groupId>第三方库groupId</groupId> <artifactId>第三方库artifactId</artifactId> <version>版本号</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </exclusion> </exclusions> </dependency>第四步:验证依赖树
使用构建工具命令检查依赖树,确保所有Jackson相关依赖版本一致:- Maven:
mvn dependency:tree - Gradle:
./gradlew dependencies
- Maven:
代码优化提示
你的检测表情的代码可以稍微优化,避免空指针或无效拆分问题:
String message = sCurrentLine.split(",")[6]; // 使用\\s+匹配任意空白符,避免拆分出空字符串 String[] words = message.split("\\s+"); for (String s : words) { if (s.isEmpty()) continue; System.out.println(s); System.out.println(" Has Emojis: " + EmojiUtils.isEmoji(s)); }
内容的提问来源于stack exchange,提问作者Muhammad Shahid
相关产品推荐
相关产品推荐

