使用JLanguageTool实现拼写检查时遇初始化异常求助
JLanguageTool运行异常排查与资源配置问题
问题场景
首次在Java环境中使用JLanguageTool开发基础拼写检查功能,已安装英语(美式)与希腊语语言包,代码编译无异常,但运行时触发ExceptionInInitializerError异常。
异常堆栈
Exception in thread "main" java.lang.ExceptionInInitializerError at org.languagetool.rules.en.CompoundRule.<clinit>(CompoundRule.java:47) at org.languagetool.language.English.getRelevantRules(English.java:170) at org.languagetool.language.AmericanEnglish.getRelevantRules(AmericanEnglish.java:71) at org.languagetool.JLanguageTool.getAllBuiltinRules(JLanguageTool.java:496) at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:326) at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:299) at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:278) at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:357) at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:244) at EngSpellchecker.<init>(SpellChecker.java:17) at main.main(SpellChecker.java:30) Caused by: java.lang.RuntimeException: Object for class 'org.languagetool.language.AmericanEnglish' specified in jar:file:/home/alexisl/.m2/repository/org/languagetool/language-en/6.6/language-en-6.6.jar!/META-INF/org/languagetool/language-module.properties could not be created at org.languagetool.Languages.createLanguageObjects(Languages.java:153) at org.languagetool.Languages.getAllLanguages(Languages.java:126) at org.languagetool.Languages.<clinit>(Languages.java:45) ... 11 more Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) at org.languagetool.Languages.createLanguageObjects(Languages.java:149) ... 13 more Caused by: java.lang.RuntimeException: Language was already instantiated, see the cause stacktrace below. at org.languagetool.language.AmericanEnglish.<init>(AmericanEnglish.java:48) at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ... 16 more Caused by: java.lang.Throwable at org.languagetool.language.AmericanEnglish.<init>(AmericanEnglish.java:50) ... 2 more Process finished with exit code 1
源代码
import org.languagetool.JLanguageTool; import org.languagetool.language.AmericanEnglish; import org.languagetool.language.Greek; import org.languagetool.rules.RuleMatch; import java.io.IOException; import java.util.List; class GreekSpellChecker extends JLanguageTool { public GreekSpellChecker(){ super(new Greek()); } } class EngSpellchecker extends JLanguageTool{ public EngSpellchecker(){ super(new AmericanEnglish()); } public void removeGrammarRules(){ for(var rule : this.getAllRules()){ if(!rule.isDictionaryBasedSpellingRule()) this.disableRule(rule.getId()); } } } class main{ public static void main(String[] args)throws IOException { EngSpellchecker checker = new EngSpellchecker(); checker.removeGrammarRules(); List<RuleMatch> matches = checker.check("this is a textt with erors so manny erors thatt makee mee sick"); for(RuleMatch match : matches){ System.out.println("error in characters "+match.getFromPos()+"-"+match.getToPos()+": "+match.getMessage()); System.out.println("Suggested replacement(s): "+match.getSuggestedReplacements()); } } }
用户疑问
- 需要下载哪些文件才能让代码正常运行?
- 这些文件应放置在什么路径下?
解决方案
核心异常修复
你遇到的Language was already instantiated异常,本质是JLanguageTool的语言类采用单例模式,不能通过new AmericanEnglish()直接实例化,这才是触发异常的根本原因,并非缺少字典或配置文件。
修改代码时,改用Languages.getLanguageForShortCode()获取单例实例:
import org.languagetool.JLanguageTool; import org.languagetool.Languages; import org.languagetool.rules.RuleMatch; import java.io.IOException; import java.util.List; class EngSpellchecker extends JLanguageTool{ public EngSpellchecker(){ // 改用单例获取方式 super(Languages.getLanguageForShortCode("en-US")); } public void removeGrammarRules(){ for(var rule : this.getAllRules()){ if(!rule.isDictionaryBasedSpellingRule()) this.disableRule(rule.getId()); } } } class main{ public static void main(String[] args)throws IOException { EngSpellchecker checker = new EngSpellchecker(); checker.removeGrammarRules(); List<RuleMatch> matches = checker.check("this is a textt with erors so manny erors thatt makee mee sick"); for(RuleMatch match : matches){ System.out.println("error in characters "+match.getFromPos()+"-"+match.getToPos()+": "+match.getMessage()); System.out.println("Suggested replacement(s): "+match.getSuggestedReplacements()); } } }
希腊语拼写检查类同理,改为Languages.getLanguageForShortCode("el")获取实例。
字典与配置文件补充(若后续仍有缺失问题)
如果修复后仍出现字典缺失相关错误,需补充以下资源:
- 美式英语资源:
.dict、.info后缀的字典文件,以及对应的grammar.xml规则配置文件 - 希腊语资源:对应语言的
.dict、.info后缀字典文件和grammar.xml配置文件
路径配置规则:
- Maven依赖方式:确保
language-en和language-el依赖已正确引入,Maven会自动将jar包内的资源(包含字典、grammar.xml)加载到类路径,无需手动放置 - 手动管理资源:将字典文件和
grammar.xml分别放在项目的src/main/resources/org/languagetool/language/en(美式英语)、src/main/resources/org/languagetool/language/el(希腊语)目录下,确保编译时能被打包到类路径中
内容的提问来源于stack exchange,提问作者ALEXIS LAZANAS
相关产品推荐
相关产品推荐

